How to circumvent format-truncation warning in GCC?

前端 未结 2 1980
一向
一向 2020-12-15 18:02

I\'m getting the following gcc format-truncation warning:

test.c:8:33: warning: ‘/input’ directive output may be truncated writing 6 bytes into a region of s         


        
相关标签:
2条回答
  • 2020-12-15 18:35

    1. warning has been intruded in gcc7.1, see gcc7.1 release changes.
    2. From gcc docs:

    Level 1 of -Wformat-truncation [...] warns only about calls to bounded functions whose return value is unused and that will most likely result in output truncation.

    1. The issue was a bug report and was closed as NOTABUG:

    Unhandled output truncation is typically a bug in the program. [...]
    In cases when truncation is expected the caller typically checks the return value from the function and handles it somehow (e.g., by branching on it). In those cases the warning is not issued. The source line printed by the warning suggests that this is not one of those cases. The warning is doing what it was designed to do.

    1. But we can just check the return value of snprintf, which returns negative value on error.

    #include <stdio.h>
    #include <stdlib.h>
    void f(void) {
        char dst[2], src[2];
        // snprintf(dst, sizeof(dst), "%s!", src);
    
        int ret = snprintf(dst, sizeof(dst), "%s!", src);
        if (ret < 0) {
             abort();
        }
    
        // But don't we love confusing one liners?
        for (int ret = snprintf(dst, sizeof(dst), "%s!", src); ret < 0;) exit(ret);
        // Can we do better?
        snprintf(dst, sizeof(dst), "%s!", src) < 0 ? abort() : (void)0;
        // Don't we love obfuscation?
    #define snprintf_nowarn(...) (snprintf(__VA_ARGS__) < 0 ? abort() : (void)0)
        snprintf_nowarn(dst, sizeof(dst), "%s!", src);
    }
    

    Tested on https://godbolt.org/ with gcc7.1 gcc7.2 gcc7.3 gcc8.1 with -O{0,1,2,3} -Wall -Wextra -pedantic. Gives no warning whatsoever. gcc8.1 optimizes/removes the call to abort() with optimization greater then -O1.

    0 讨论(0)
  • 2020-12-15 18:59

    This error is only triggered when length-limited *printf functions are called (snprintf, vsnprintf). In other words, it is not an indication that you may be writing into unallocated memory, as may happen with sprintf; it only notifies you that you aren't paying attention to when snprintf may be doing is job and truncating.

    Knowing that, I'm much more sanguine about disabling it globally using -Wno-format-truncation, rather than trying to coax gcc into ignoring a specific instance.

    0 讨论(0)
提交回复
热议问题