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) ==5501== by 0x403BDC: autoWirelessScanPlus (automated_scanner.c:386) ==5501== by 0x40400D: autoWirelessScanPlus_RN (automated_scanner.c:549) ==5501== by 0x402E2C: main (backend.c:251) ==5501== Uninitialised value was created by a stack allocation ==5501== at 0x4034BB: getRadiatingWifiList (automated_scanner.c:155)
The code portion is this: tmp_wifi_quality = calloc(sizeof(wifi_quality), 1); Here follows testing of return value from calloc, but I am not quoting it. active_wifi_list[*active_wifis] = tmp_wifi_quality; char* substr = strstr((char *) scan_buffer, "Signal level="); substr = strstr(substr, "="); char* endstr = strstr(substr + 1, " "); char tmpstr[MAX_ESSID_LENGTH]; strncpy(tmpstr, substr + 1, endstr - substr - 1); tmpstr[endstr - substr + 1] = '\0'; tmp_wifi_quality->quality = strtod(tmpstr, NULL); Needless to state, the above works, but valgrind complains. Edward On 14/10/2015, Rainer Weikusat <rainerweiku...@virginmedia.com> wrote: > Edward Bartolo <edb...@gmail.com> writes: >> The problem according to my logic seems to be result is used in a >> branch control expression before it is initialised. However, I am >> emailing this to have other opinions. >> >> >> int essid_alloc( >> size_t length, >> char ** result >> ) { >> char * tmp; >> >> if(length==0 || !result) >> return EINVAL; >> >> tmp = (char *) calloc(length, 1); >> >> if(!tmp) >> return ENOMEM; >> >> *result = tmp; >> >> return 0; >> } > > result can't be uinitialized because it's an argument the caller must > provide. *result may be uninitialized but this doesn't really matter > unless the caller uses it regardless of the function return value. It > would be helpful to know what valgrind actually prints. > > OTOH, the function above is equivalent to just doing a > > char *essid; > > essid = calloc(length, 1); > if (!essid) /* ENOMEM */ > > in the caller and IMHO, the whole function should be removed. There's > also no point in casting the result of any memory allocation routine _in > C_ as a void * will automatically be converted to whatever type was > asked for on assignment (and there are rare cases where this may mask an > actual error[*]). > > [*] In particular, using calloc without a prototype in scope will cause > the compiler to assume that it returns and int. This will work on a > 32-bit system because the sizeof of a pointer is == sizeof(int) but > will fail on 64-bit (I had to mispleasure to debug this once when > moving some 'working' 32-bit Linux code to Solaris 8 on Sparc ...). > _______________________________________________ > Dng mailing list > Dng@lists.dyne.org > https://mailinglists.dyne.org/cgi-bin/mailman/listinfo/dng > _______________________________________________ Dng mailing list Dng@lists.dyne.org https://mailinglists.dyne.org/cgi-bin/mailman/listinfo/dng