[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: [libvirt] [PATCH] build: silence false positive clang report



On 02/14/2011 04:37 PM, Eric Blake wrote:
clang complained that STREQ(group->controllers[i].mountPoint,...)  was
a NULL dereference when i==VIR_CGROUP_CONTROLLER_CPUSET, because it
assumes the worst about virCgroupPathOfController.  Marking the
argument const doesn't yet have an effect, per this clang bug:
http://llvm.org/bugs/show_bug.cgi?id=7758

So, we use sa_assert, which was designed to shut up false positives
from tools like clang.

* src/util/cgroup.c (virCgroupMakeGroup): Teach clang that there
is no NULL dereference.
---

I'm including enough context to show the STREQ that clang complained
about.

And yes, I'm plowing through clang reports right now - there were
less than 20, so it seemed worth tackling before 0.8.8.

This one is a one-liner fix (tested by re-running clang and no longer
seeing a false positive, and sa_assert() is a no-op for gcc compilation),
but I'd rather get an ACK before pushing.

  src/util/cgroup.c |    3 +++
  1 files changed, 3 insertions(+), 0 deletions(-)

diff --git a/src/util/cgroup.c b/src/util/cgroup.c
index de1fd8e..47c4633 100644
--- a/src/util/cgroup.c
+++ b/src/util/cgroup.c
@@ -496,24 +496,27 @@ static int virCgroupMakeGroup(virCgroupPtr parent, virCgroupPtr group,

      VIR_DEBUG("Make group %s", group->path);
      for (i = 0 ; i<  VIR_CGROUP_CONTROLLER_LAST ; i++) {
          char *path = NULL;

          /* Skip over controllers that aren't mounted */
          if (!group->controllers[i].mountPoint)
              continue;

          rc = virCgroupPathOfController(group, i, "",&path);
          if (rc<  0)
              return rc;
+        /* As of Feb 2011, clang can't see that the above function
+         * call did not modify group. */
+        sa_assert(group->controllers[i].mountPoint);

          VIR_DEBUG("Make controller %s", path);
          if (access(path, F_OK) != 0) {
              if (!create ||
                  mkdir(path, 0755)<  0) {
                  rc = -errno;
                  VIR_FREE(path);
                  break;
              }
              if (group->controllers[VIR_CGROUP_CONTROLLER_CPUSET].mountPoint != NULL&&
                  (i == VIR_CGROUP_CONTROLLER_CPUSET ||
                   STREQ(group->controllers[i].mountPoint, group->controllers[VIR_CGROUP_CONTROLLER_CPUSET].mountPoint))) {

ACK.


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]