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 }