Thanks Will,

I have just seen that it has also been fixed in our master branch. :-)

Frank

> On 18. Oct 2018, at 17:40, William Cohen <wco...@redhat.com> wrote:
> 
> On 10/18/18 10:43 AM, Frank Winkler wrote:
>> Hi all,
>> 
>> As I did not get a reply from Stephane I would like to turn this to the 
>> perfmon2-devel mailing list.
>> Please see the text below:
>> 
>> Hi Stephane,
>> 
>> I would like to ask for your help.
>> There is a build problem of PAPI when using gcc/8.
>> 
>> See open issue here:
>> https://bitbucket.org/icl/papi/issues/51/build-failed-using-gcc-810
>> 
>> 
>> This issue can be fixed very easily by just increasing the buffer size.
>> As this is part of libpfm4 I would like to address this to you.
>> 
>> The main reason for the build failure is that PAPI converts warnings to 
>> errors, see:
>> 
>> -Werror (Make the specified warning into an error)
>> -Wformat-truncation (Warn about calls to formatted input/output functions 
>> such as |snprintf| and |vsnprintf| that might result in output truncation)
>> 
>> And the latest gcc versions message warnings for snprintf if the buffer is 
>> too small and output might be truncated.
>> 
>> 
>> Here a small example:
>> 
>> cat test.c:
>> 
>> int main()
>> {
>>   char dirname[256];
>>   char filename[256];
>> 
>>   strcpy(dirname,"/ccs/home/winklerf/sources");
>>   strcpy(filename,"frank.txt");
>>   char pathname[256];
>> 
>>   snprintf(pathname, sizeof(pathname), "%s/%s", dirname, filename);
>> 
>>   puts(pathname);
>>   return 0;
>> }
>> 
>> gcc -Werror -Wformat-truncation test.c -o test
>> [winklerf@login3.summit <mailto:winklerf@login3.summit> sources]$ gcc 
>> -Werror -Wformat-truncation test.c -o test
>> test.c: In function 'main':
>> test.c:17:43: error: '%s' directive output may be truncated writing up to 
>> 255 bytes into a region of size between 0 and 255 
>> [-Werror=format-truncation=]
>>    snprintf(pathname, sizeof pathname, "%s/%s", dirname, filename);
>>                                            ^~            ~~~~~~~~
>> test.c:17:3: note: 'snprintf' output between 2 and 512 bytes into a 
>> destination of size 256
>>    snprintf(pathname, sizeof pathname, "%s/%s", dirname, filename);
>>    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> cc1: all warnings being treated as errors
>> 
>> 
>> The same happens with PAPI when building with gcc/8:
>> 
>> make[2]: Entering directory 
>> `/autofs/nccs-svm1_home2/winklerf/sources/papi-5.6.0/src/libpfm4/lib'
>> gcc  -Wno-override-init  -g -Wall -Werror -Wextra -Wno-unused-parameter -I. 
>> -I/autofs/nccs-svm1_home2/winklerf/sources/papi-5.6.0/src/libpfm4/lib/../include
>>  -DCONFIG_PFMLIB_DEBUG -DCONFIG_PFMLIB_OS_LINUX -D_REENTRANT -I. 
>> -fvisibility=hidden -DCONFIG_PFMLIB_ARCH_POWERPC -I. -c pfmlib_common.c
>> gcc  -Wno-override-init  -g -Wall -Werror -Wextra -Wno-unused-parameter -I. 
>> -I/autofs/nccs-svm1_home2/winklerf/sources/papi-5.6.0/src/libpfm4/lib/../include
>>  -DCONFIG_PFMLIB_DEBUG -DCONFIG_PFMLIB_OS_LINUX -D_REENTRANT -I. 
>> -fvisibility=hidden -DCONFIG_PFMLIB_ARCH_POWERPC -I. -c 
>> pfmlib_perf_event_pmu.c
>> pfmlib_perf_event_pmu.c: In function 'gen_tracepoint_table':
>> pfmlib_perf_event_pmu.c:349:36: error: '%s' directive output may be 
>> truncated writing up to 255 bytes into a region of size between 0 and 4095 
>> [-Werror=format-truncation=]
>>    snprintf(d2path, MAXPATHLEN, "%s/%s", debugfs_mnt, d1->d_name);
>>                                     ^~
>> pfmlib_perf_event_pmu.c:349:3: note: 'snprintf' output between 2 and 4352 
>> bytes into a destination of size 4096
>>    snprintf(d2path, MAXPATHLEN, "%s/%s", debugfs_mnt, d1->d_name);
>>    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> pfmlib_perf_event_pmu.c:399:58: error: '%s' directive output may be 
>> truncated writing up to 255 bytes into a region of size between 0 and 4095 
>> [-Werror=format-truncation=]
>>                          snprintf(idpath, MAXPATHLEN, "%s/%s/id", d2path, 
>> d2->d_name);
>>                                                           ^~
>> pfmlib_perf_event_pmu.c:399:25: note: 'snprintf' output between 5 and 4355 
>> bytes into a destination of size 4096
>>                          snprintf(idpath, MAXPATHLEN, "%s/%s/id", d2path, 
>> d2->d_name);
>>                          
>> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> cc1: all warnings being treated as errors
>> 
>> 
>> The 2 lines of the following file have to be fixed:
>> 
>> vi src/libpfm4/lib/pfmlib_perf_event_pmu.c
>> 
>> 349         snprintf(d2path, MAXPATHLEN + 256, "%s/%s", debugfs_mnt, 
>> d1->d_name);
>> 
>> 
>> 399                         snprintf(idpath, MAXPATHLEN + 3 + 256, 
>> "%s/%s/id", d2path, d2->d_name);
>> 
>> There should be a more general fix, of course. But this is up to you, maybe 
>> just increase MAXPATHLEN...
>> 
>> Thanks
>> Frank
> 
> 
> Hi,
> 
> This kind of problem has been encountered before on the Fedora builds. There 
> are two ways to address it:
> 
> -Ensure that the buffer that result is being stored in is large enough to 
> never overflow as you mentioned.  However, it would be better to avoid using 
> arithmetic expression with constants in there as that might not match up with 
> the buffer things are being written into when someone changes the size of the 
> buffer.  Maybe something like the following avoids that problem, but need to 
> make sure that the last element in buf is '\0'.
> 
> snprintf(buf, sizeof(buf)-1, "%s::%s", pinfo.name, info->name);
> buf[sizeof(buf)-1] = '\0';
> 
> -Check the return value of the snprintf function and take appropriate action 
> if there is an overflow
>  an example fix on libpfm, 
> https://sourceforge.net/p/perfmon2/libpfm4/ci/29f626744df184913a200532408e205e2b0ec2ec/
> 
> 
> -Will



_______________________________________________
perfmon2-devel mailing list
perfmon2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/perfmon2-devel

Reply via email to