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