:: Re: [DNG] int essid_alloc is causin…
Startseite
Nachricht löschen
Nachricht beantworten
Autor: Rainer Weikusat
Datum:  
To: dng
Betreff: Re: [DNG] int essid_alloc is causing valgrind to report a series of errors
Peter Olson <peabo@???> writes:
>> On October 14, 2015 at 3:20 PM Edward Bartolo <edbarx@???> wrote:
>>
>>
>> This is another part of the backend code where valgrind is saying:
>>
>> ==5501== 5 errors in context 1 of 3:
>> ==5501== Use of uninitialised value of size 8
>> ==5501==    at 0x5172AFC: ____strtod_l_internal (strtod_l.c:889)
>> ==5501==    by 0x403856: getRadiatingWifiList (automated_scanner.c:265)


[...]

> This diagnostic bothers me:
>
>> ==5501==  Uninitialised value was created by a stack allocation
>> ==5501==    at 0x4034BB: getRadiatingWifiList (automated_scanner.c:155)

>
> This is hundreds of lines away from
>
>> ==5501==    by 0x403856: getRadiatingWifiList
>> (automated_scanner.c:265)


"ELARGEFUNCTION"

> which is presumably
>
>>                 tmp_wifi_quality->quality = strtod(tmpstr, NULL);

>
> You should probably investigate the area around line 155.


Since the explanation may be useful: 'Stack allocations' usually happen
at the beginning of a function, regardless of the point of a variable
declaration. Eg, when running the following test/ example program:

------
/* 1 */ #include <stdlib.h>
/* 2 */ #include <string.h>
/* 3 */ #include <stdio.h>
/* 4 */ 
/* 5 */ char const scan_buffer[] = "yadda Signal level=5.9 fff";
/* 6 */ 
/* 7 */ int main(void)
/* 8 */ {
/* 9 */     double d;
/* 10 */            
/* 11 */            char* substr = strstr((char *) scan_buffer, "Signal level=");
/* 12 */            substr = strstr(substr, "=");
/* 13 */            char* endstr = strstr(substr + 1, " ");
/* 14 */            char tmpstr[8];
/* 15 */            strncpy(tmpstr, substr + 1, endstr - substr - 1);
/* 16 */            tmpstr[endstr - substr + 1] = '\0';
/* 17 */
/* 18 */            d = strtod(tmpstr, NULL);
/* 19 */            printf("%f\n", d);
/* 20 */
/* 21 */            return 0;
/* 22 */        }
------


via

$valgrind --track-origins=yes ./a.out

one gets the following (partial) output:

==27072== Conditional jump or move depends on uninitialised value(s)
==27072==    at 0x4E63430: ____strtod_l_internal (strtod_l.c:803)
==27072==    by 0x40066B: main (aa.c:18)
==27072==  Uninitialised value was created by a stack allocation
==27072==    at 0x4005D4: main (aa.c:8)
==27072== 
==27072== Use of uninitialised value of size 8
==27072==    at 0x4E6343E: ____strtod_l_internal (strtod_l.c:818)
==27072==    by 0x40066B: main (aa.c:18)
==27072==  Uninitialised value was created by a stack allocation
==27072==    at 0x4005D4: main (aa.c:8)


The uninitialized values is used on line 18 but reported as allocated on
line 8 which is the start of the function.