On 06/04/2015 11:13 AM, Peter Krempa wrote:
> On Thu, Jun 04, 2015 at 08:34:00 -0400, John Ferlan wrote:
>>
>>
>> On 06/04/2015 08:15 AM, Peter Krempa wrote:
>>> Refactor the code flow a bit more to clear coverity errors.
>>>
>>> Store the cpu count in an intermediate variable and reuse it rather than
>>> caluclating the index.
>>> ---
>>>  src/util/virprocess.c | 11 +++++++----
>>>  1 file changed, 7 insertions(+), 4 deletions(-)
>>>
>>> diff --git a/src/util/virprocess.c b/src/util/virprocess.c
>>> index a38cb75..c07e5cd 100644
>>> --- a/src/util/virprocess.c
>>> +++ b/src/util/virprocess.c
>>> @@ -474,12 +474,14 @@ virProcessGetAffinity(pid_t pid)
>>>      size_t i;
>>>      cpu_set_t *mask;
>>>      size_t masklen;
>>> +    size_t ncpus;
>>>      virBitmapPtr ret = NULL;
>>>
>>>  # ifdef CPU_ALLOC
>>>      /* 262144 cpus ought to be enough for anyone */
>>> -    masklen = CPU_ALLOC_SIZE(1024 << 8);
>>> -    mask = CPU_ALLOC(1024 << 8);
>>> +    ncpus = 1024 << 8;
>>> +    masklen = CPU_ALLOC_SIZE(ncpus);
>>> +    mask = CPU_ALLOC(ncpus);
>>>
>>>      if (!mask) {
>>>          virReportOOMError();
>>> @@ -488,6 +490,7 @@ virProcessGetAffinity(pid_t pid)
>>>
>>>      CPU_ZERO_S(masklen, mask);
>>>  # else
>>> +    ncpus = 1024;
>>>      if (VIR_ALLOC(mask) < 0)
>>>          return NULL;
>>>
>>> @@ -501,10 +504,10 @@ virProcessGetAffinity(pid_t pid)
>>>          goto cleanup;
>>>      }
>>>
>>> -    if (!(ret = virBitmapNew(masklen * 8)))
>>> +    if (!(ret = virBitmapNew(ncpus)))
>>>            goto cleanup;
>>>
>>> -    for (i = 0; i < masklen * 8; i++) {
>>> +    for (i = 0; i < ncpus; i++) {
>>>  # ifdef CPU_ALLOC
>>>          if (CPU_ISSET_S(i, masklen, mask))
>>
>> ^^^ Coverity still complains here
>>
>> No real change since previous...
> 
> Would you mind sharing the error after applying this patch?
> 
> Peter
> 

Sure (it's cut-n-paste)

471     virBitmapPtr
472     virProcessGetAffinity(pid_t pid)
473     {
474         size_t i;
475         cpu_set_t *mask;
476         size_t masklen;
477         size_t ncpus;
478         virBitmapPtr ret = NULL;
479     
480     # ifdef CPU_ALLOC
481         /* 262144 cpus ought to be enough for anyone */

(1) Event assignment:   Assigning: "ncpus" = "262144UL".
Also see events:        [cond_at_most][assignment][overrun-local]

482         ncpus = 1024 << 8;
483         masklen = CPU_ALLOC_SIZE(ncpus);
484         mask = CPU_ALLOC(ncpus);
485     

(2) Event cond_false:   Condition "!mask", taking false branch

486         if (!mask) {
487             virReportOOMError();
488             return NULL;

(3) Event if_end:       End of if statement

489         }
490     
491         CPU_ZERO_S(masklen, mask);
492     # else
493         ncpus = 1024;
494         if (VIR_ALLOC(mask) < 0)
495             return NULL;
496     
497         masklen = sizeof(*mask);
498         CPU_ZERO(mask);
499     # endif
500     

(4) Event cond_false:   Condition "sched_getaffinity(pid, masklen, mask) < 0", 
taking false branch

501         if (sched_getaffinity(pid, masklen, mask) < 0) {
502             virReportSystemError(errno,
503                                  _("cannot get CPU affinity of process 
%d"), pid);
504             goto cleanup;

(5) Event if_end:       End of if statement

505         }
506     

(6) Event cond_false:   Condition "!(ret = virBitmapNew(ncpus))", taking false 
branch

507         if (!(ret = virBitmapNew(ncpus)))

(7) Event if_end:       End of if statement

508               goto cleanup;
509     

(8) Event cond_true:    Condition "i < ncpus", taking true branch
(13) Event loop_begin:  Jumped back to beginning of loop
(14) Event cond_true:   Condition "i < ncpus", taking true branch
(15) Event cond_at_most:        Checking "i < ncpus" implies that "i" may be up 
to 262143 on the true branch.
Also see events:        [assignment][assignment][overrun-local]

510         for (i = 0; i < ncpus; i++) {
511     # ifdef CPU_ALLOC

(9) Event cond_true:    Condition "__cpu / 8 < masklen", taking true branch
(10) Event cond_true:   Condition "((__cpu_mask const *)mask->__bits[__cpu / 
(64UL /* 8 * sizeof (__cpu_mask) */)] & (1UL /* (__cpu_mask)1 */ << __cpu % 
(64UL /* 8 * sizeof (__cpu_mask) */))) != 0", taking true branch
(11) Event cond_true:   Condition "({...})", taking true branch
(16) Event assignment:  Assigning: "__cpu" = "i". The value of "__cpu" may now 
be up to 262143.
(17) Event cond_true:   Condition "__cpu / 8 < masklen", taking true branch
(18) Event overrun-local:       Overrunning array of 16 8-byte elements at 
element index 4095 (byte offset 32760) by dereferencing pointer "(__cpu_mask 
const *)mask->__bits + __cpu / 64UL".
Also see events:        [assignment][cond_at_most]

512             if (CPU_ISSET_S(i, masklen, mask))
513                 ignore_value(virBitmapSetBit(ret, i));
514     # else
515             if (CPU_ISSET(i, mask))
516                 ignore_value(virBitmapSetBit(ret, i));
517     # endif

(12) Event loop:        Jumping back to the beginning of the loop

518         }
519     
520      cleanup:
521     # ifdef CPU_ALLOC
522         CPU_FREE(mask);
523     # else
524         VIR_FREE(mask);
525     # endif
526     
527         return ret;
528     }

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to