emilk / emilk/loguru

Many `snprintf` truncation warnings

Open
#184 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
C++
Stars
1.9k
Forks
280
Avg merge
7m
Merged PRs (30d)
4

Description

GCC `-Wformat-truncation=2` flag warns about potential truncations on the source content.

It flags many warnings in Loguru:

```
[108/305] Compiling C++ object src/libs/loguru/libloguru.a.p/loguru.cpp.o
../../src/libs/loguru/loguru.cpp: In function ‘void loguru::print_preamble_header(char*, size_t)’:
../../src/libs/loguru/loguru.cpp:1259:85: warning: ‘time ’ directive output truncated writing 13 bytes into a region of size 1 [-Wformat-truncation=]
1259 | int bytes = snprintf(out_buff + pos, out_buff_size - pos, "time ");
| ~^~~~~~~~~~~~
In file included from /usr/include/stdio.h:866,
from /usr/include/c++/11/cstdio:42,
from ../../src/libs/loguru/loguru.cpp:38:
/usr/include/x86_64-linux-gnu/bits/stdio2.h:71:35: note: ‘__builtin_snprintf’ output 14 bytes into a destination of size 1
71 | return __builtin___snprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1,
| ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
72 | __glibc_objsize (__s), __fmt,
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
73 | __va_arg_pack ());
| ~~~~~~~~~~~~~~~~~
../../src/libs/loguru/loguru.cpp:1265:85: warning: ‘( uptime ) ’ directive output truncated writing 12 bytes into a region of size 1 [-Wformat-truncation=]
1265 | int bytes = snprintf(out_buff + pos, out_buff_size - pos, "( uptime ) ");
| ~^~~~~~~~~~~
In file included from /usr/include/stdio.h:866,
from /usr/include/c++/11/cstdio:42,
from ../../src/libs/loguru/loguru.cpp:38:
/usr/include/x86_64-linux-gnu/bits/stdio2.h:71:35: note: ‘__builtin_snprintf’ output 13 bytes into a destination of size 1
71 | return __builtin___snprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1,
| ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
72 | __glibc_objsize (__s), __fmt,
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
73 | __va_arg_pack ());
| ~~~~~~~~~~~~~~~~~
../../src/libs/loguru/loguru.cpp:1271:85: warning: ‘%-*s’ directive output truncated writing 16 bytes into a region of size 0 [-Wformat-truncation=]
1271 | int bytes = snprintf(out_buff + pos, out_buff_size - pos, "[%-*s]", LOGURU_THREADNAME_WIDTH, " thread name/id");
| ^~~~ ~~~~~~~~~~~~~~~~~
In file included from /usr/include/stdio.h:866,
from /usr/include/c++/11/cstdio:42,
from ../../src/libs/loguru/loguru.cpp:38:
/usr/include/x86_64-linux-gnu/bits/stdio2.h:71:35: note: ‘__builtin___snprintf_chk’ output 19 bytes into a destination of size 1
71 | return __builtin___snprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1,
| ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
72 | __glibc_objsize (__s), __fmt,
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
73 | __va_arg_pack ());
| ~~~~~~~~~~~~~~~~~
../../src/libs/loguru/loguru.cpp:1277:84: warning: ‘%*s’ directive output truncated writing 23 bytes into a region of size 1 [-Wformat-truncation=]
1277 | int bytes = snprintf(out_buff + pos, out_buff_size - pos, "%*s:line ", LOGURU_FILENAME_WIDTH, "file");
| ^~~ ~~~~~~
In file included from /usr/include/stdio.h:866,
from /usr/include/c++/11/cstdio:42,
from ../../src/libs/loguru/loguru.cpp:38:
/usr/include/x86_64-linux-gnu/bits/stdio2.h:71:35: note: ‘__builtin___snprintf_chk’ output 31 bytes into a destination of size 1
71 | return __builtin___snprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1,
| ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
72 | __glibc_objsize (__s), __fmt,
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
73 | __va_arg_pack ());
| ~~~~~~~~~~~~~~~~~
../../src/libs/loguru/loguru.cpp:1283:85: warning: ‘ v’ directive output truncated writing 4 bytes into a region of size 1 [-Wformat-truncation=]
1283 | int bytes = snprintf(out_buff + pos, out_buff_size - pos, " v");
| ~^~~
In file included from /usr/include/stdio.h:866,
from /usr/include/c++/11/cstdio:42,
from ../../src/libs/loguru/loguru.cpp:38:
/usr/include/x86_64-linux-gnu/bits/stdio2.h:71:35: note: ‘__builtin_snprintf’ output 5 bytes into a destination of size 1
71 | return __builtin___snprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1,
| ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
72 | __glibc_objsize (__s), __fmt,
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
73 | __va_arg_pack ());
| ~~~~~~~~~~~~~~~~~
../../src/libs/loguru/loguru.cpp:1289:79: warning: ‘| ’ directive output truncated writing 2 bytes into a region of size 1 [-Wformat-truncation=]
1289 | (void)snprintf(out_buff + pos, out_buff_size - pos, "| ");
| ~^
In file included from /usr/include/stdio.h:866,
from /usr/include/c++/11/cstdio:42,
from ../../src/libs/loguru/loguru.cpp:38:
/usr/include/x86_64-linux-gnu/bits/stdio2.h:71:35: note: ‘__builtin_snprintf’ output 3 bytes into a destination of size 1
71 | return __builtin___snprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1,
| ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
72 | __glibc_objsize (__s), __fmt,
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
73 | __va_arg_pack ());
| ~~~~~~~~~~~~~~~~~
../../src/libs/loguru/loguru.cpp: In function ‘void loguru::get_thread_name(char*, long long unsigned int, bool)’:
../../src/libs/loguru/loguru.cpp:1068:82: warning: ‘__builtin_snprintf’ output may be truncated before the last format character [-Wformat-truncation=]
1068 | snprintf(buffer, static_cast(length), "%s", name);
| ^
In file included from /usr/include/stdio.h:866,
from /usr/include/c++/11/cstdio:42,
from ../../src/libs/loguru/loguru.cpp:38:
/usr/include/x86_64-linux-gnu/bits/stdio2.h:71:35: note: ‘__builtin_snprintf’ output 1 or more bytes (assuming 2) into a destination of size 1
71 | return __builtin___snprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1,
| ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
72 | __glibc_objsize (__s), __fmt,
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
73 | __va_arg_pack ());
| ~~~~~~~~~~~~~~~~~
../../src/libs/loguru/loguru.cpp:1107:80: warning: ‘%X’ directive output may be truncated writing between 1 and 8 bytes into a region of size 1 [-Wformat-truncation=]
1107 | snprintf(buffer, static_cast(length), "%X", static_cast(thread_id));
| ^~
../../src/libs/loguru/loguru.cpp:1107:79: note: using the range [0, 4294967295] for directive argument
1107 | snprintf(buffer, static_cast(length), "%X", static_cast(thread_id));
| ^~~~
In file included from /usr/include/stdio.h:866,
from /usr/include/c++/11/cstdio:42,
from ../../src/libs/loguru/loguru.cpp:38:
/usr/include/x86_64-linux-gnu/bits/stdio2.h:71:35: note: ‘__builtin___snprintf_chk’ output between 2 and 9 bytes into a destination of size 1
71 | return __builtin___snprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1,
| ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
72 | __glibc_objsize (__s), __fmt,
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
73 | __va_arg_pack ());
| ~~~~~~~~~~~~~~~~~
../../src/libs/loguru/loguru.cpp:1105:80: warning: ‘%*X’ directive output may be truncated writing between 1 and 2147483648 bytes into a region of size 1 [-Wformat-truncation=]
1105 | snprintf(buffer, static_cast(length), "%*X", static_cast(length - 1), static_cast(thread_id));
| ^~~
../../src/libs/loguru/loguru.cpp:1105:79: note: assuming directive output of 9 bytes
1105 | snprintf(buffer, static_cast(length), "%*X", static_cast(length - 1), static_cast(thread_id));
| ^~~~~
../../src/libs/loguru/loguru.cpp:1105:79: note: using the range [0, 4294967295] for directive argument
In file included from /usr/include/stdio.h:866,
from /usr/include/c++/11/cstdio:42,
from ../../src/libs/loguru/loguru.cpp:38:
/usr/include/x86_64-linux-gnu/bits/stdio2.h:71:35: note: ‘__builtin___snprintf_chk’ output between 2 and 2147483649 bytes into a destination of size 1
71 | return __builtin___snprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1,
| ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
72 | __glibc_objsize (__s), __fmt,
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
73 | __va_arg_pack ());
| ~~~~~~~~~~~~~~~~~
../../src/libs/loguru/loguru.cpp: In function ‘void loguru::print_preamble(char*, size_t, loguru::Verbosity, const char*, unsigned int)’:
../../src/libs/loguru/loguru.cpp:1325:71: warning: ‘% 4d’ directive output may be truncated writing between 4 and 11 bytes into a region of size 5 [-Wformat-truncation=]
1325 | snprintf(level_buff, sizeof(level_buff) - 1, "% 4d", verbosity);
| ^~~~
../../src/libs/loguru/loguru.cpp:1325:70: note: directive argument in the range [1, 2147483647]
1325 | snprintf(level_buff, sizeof(level_buff) - 1, "% 4d", verbosity);
| ^~~~~~
In file included from /usr/include/stdio.h:866,
from /usr/include/c++/11/cstdio:42,
from ../../src/libs/loguru/loguru.cpp:38:
/usr/include/x86_64-linux-gnu/bits/stdio2.h:71:35: note: ‘__builtin___snprintf_chk’ output between 5 and 12 bytes into a destination of size 5
71 | return __builtin___snprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1,
| ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
72 | __glibc_objsize (__s), __fmt,
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
73 | __va_arg_pack ());
| ~~~~~~~~~~~~~~~~~
../../src/libs/loguru/loguru.cpp:1338:84: warning: ‘%02d’ directive output truncated writing between 2 and 11 bytes into a region of size 1 [-Wformat-truncation=]
1338 | int bytes = snprintf(out_buff + pos, out_buff_size - pos, "%02d:%02d:%02d.%03lld ",
| ^~~~
../../src/libs/loguru/loguru.cpp:1338:83: note: directive argument in the range [-999, 999]
1338 | int bytes = snprintf(out_buff + pos, out_buff_size - pos, "%02d:%02d:%02d.%03lld ",
| ^~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/include/stdio.h:866,
from /usr/include/c++/11/cstdio:42,
from ../../src/libs/loguru/loguru.cpp:38:
/usr/include/x86_64-linux-gnu/bits/stdio2.h:71:35: note: ‘__builtin___snprintf_chk’ output between 14 and 42 bytes into a destination of size 1
71 | return __builtin___snprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1,
| ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
72 | __glibc_objsize (__s), __fmt,
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
73 | __va_arg_pack ());
| ~~~~~~~~~~~~~~~~~
../../src/libs/loguru/loguru.cpp:1345:85: warning: ‘%8.3f’ directive output truncated writing between 8 and 314 bytes into a region of size 0 [-Wformat-truncation=]
1345 | int bytes = snprintf(out_buff + pos, out_buff_size - pos, "(%8.3fs) ",
| ^~~~~
In file included from /usr/include/stdio.h:866,
from /usr/include/c++/11/cstdio:42,
from ../../src/libs/loguru/loguru.cpp:38:
/usr/include/x86_64-linux-gnu/bits/stdio2.h:71:35: note: ‘__builtin___snprintf_chk’ output between 13 and 319 bytes into a destination of size 1
71 | return __builtin___snprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1,
| ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
72 | __glibc_objsize (__s), __fmt,
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
73 | __va_arg_pack ());
| ~~~~~~~~~~~~~~~~~
../../src/libs/loguru/loguru.cpp:1352:85: warning: ‘%-*s’ directive output truncated writing 16 or more bytes into a region of size 0 [-Wformat-truncation=]
1352 | int bytes = snprintf(out_buff + pos, out_buff_size - pos, "[%-*s]",
| ^~~~
1353 | LOGURU_THREADNAME_WIDTH, thread_name);
| ~~~~~~~~~~~
In file included from /usr/include/stdio.h:866,
from /usr/include/c++/11/cstdio:42,
from ../../src/libs/loguru/loguru.cpp:38:
/usr/include/x86_64-linux-gnu/bits/stdio2.h:71:35: note: ‘__builtin___snprintf_chk’ output 19 or more bytes into a destination of size 1
71 | return __builtin___snprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1,
| ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
72 | __glibc_objsize (__s), __fmt,
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
73 | __va_arg_pack ());
| ~~~~~~~~~~~~~~~~~
../../src/libs/loguru/loguru.cpp:1361:84: warning: ‘%*s’ directive output truncated writing 23 bytes into a region of size 1 [-Wformat-truncation=]
1361 | int bytes = snprintf(out_buff + pos, out_buff_size - pos, "%*s:%-5u ",
| ^~~
1362 | LOGURU_FILENAME_WIDTH, shortened_filename, line);
| ~~~~~~~~~~~~~~~~~~
In file included from /usr/include/stdio.h:866,
from /usr/include/c++/11/cstdio:42,
from ../../src/libs/loguru/loguru.cpp:38:
/usr/include/x86_64-linux-gnu/bits/stdio2.h:71:35: note: ‘__builtin___snprintf_chk’ output between 31 and 36 bytes into a destination of size 1
71 | return __builtin___snprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1,
| ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
72 | __glibc_objsize (__s), __fmt,
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
73 | __va_arg_pack ());
| ~~~~~~~~~~~~~~~~~
../../src/libs/loguru/loguru.cpp:1368:84: warning: ‘%4s’ directive output truncated writing between 4 and 5 bytes into a region of size 1 [-Wformat-truncation=]
1368 | int bytes = snprintf(out_buff + pos, out_buff_size - pos, "%4s",
| ^~~
1369 | level_buff);
| ~~~~~~~~~~
In file included from /usr/include/stdio.h:866,
from /usr/include/c++/11/cstdio:42,
from ../../src/libs/loguru/loguru.cpp:38:
/usr/include/x86_64-linux-gnu/bits/stdio2.h:71:35: note: ‘__builtin___snprintf_chk’ output between 5 and 6 bytes into a destination of size 1
71 | return __builtin___snprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1,
| ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
72 | __glibc_objsize (__s), __fmt,
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
73 | __va_arg_pack ());
| ~~~~~~~~~~~~~~~~~
../../src/libs/loguru/loguru.cpp:1375:79: warning: ‘| ’ directive output truncated writing 2 bytes into a region of size 1 [-Wformat-truncation=]
1375 | (void)snprintf(out_buff + pos, out_buff_size - pos, "| ");
```

Contributor guide

No contributing guide indexed for this repository

Research direction

Start in src/libs/loguru/loguru.cpp at get_thread_name, print_preamble_header, and print_preamble, where the reported snprintf warnings occur. Reproduce the build with GCC -Wformat-truncation=2, inspect the affected buffer sizes and formatting calls, and confirm that the warnings are removed without changing log output.

Written by the indexing model from the issue text.

Assessment

Tech stack
cpp
Domain
tooling
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.