https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121195
Bug ID: 121195
Summary: [GCOV] Incorrect cov for return-stmt after access of
errno.
Product: gcc
Version: 16.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: gcov-profile
Assignee: unassigned at gcc dot gnu.org
Reporter: njuwy at smail dot nju.edu.cn
Target Milestone: ---
gcc version:
gcc version 16.0.0 20250704 (experimental) (GCC)
cmd:
gcc --coverage -std=c2x -lm -O0 test.c -o test
./test
gcov ./*.gcda -t > test.c.gcov
$ cat test.c
#include <errno.h>
#include <locale.h>
#include <stdlib.h>
#include <stdio.h>
void process(int value) {
if (value < 0) {
errno = EINVAL;
return;
}
char *endptr;
const char *locale = setlocale(LC_ALL, NULL);
if (!locale) {
fprintf(stderr, "Failed to get locale\n");
return;
}
char buf[256];
snprintf(buf, sizeof(buf), "%s", locale);
long result = strtol(buf, &endptr, 10);
if (*endptr != '\0') {
fprintf(stderr, "Invalid number format\n");
return;
}
}
int main() {
for (int i = 0; i < 5; ++i) {
process(i - 2);
}
return EXIT_SUCCESS;
}
$ cat test.c.gcov
-: 1:#include <errno.h>
-: 2:#include <locale.h>
-: 3:#include <stdlib.h>
-: 4:#include <stdio.h>
5: 5:void process(int value) {
5: 6: if (value < 0) {
2: 7: errno = EINVAL;
5: 8: return;
-: 9: }
-: 10: char *endptr;
3: 11: const char *locale = setlocale(LC_ALL, NULL);
3: 12: if (!locale) {
#####: 13: fprintf(stderr, "Failed to get locale\n");
#####: 14: return;
-: 15: }
-: 16:
-: 17: char buf[256];
3: 18: snprintf(buf, sizeof(buf), "%s", locale);
3: 19: long result = strtol(buf, &endptr, 10);
3: 20: if (*endptr != '\0') {
3: 21: fprintf(stderr, "Invalid number format\n");
3: 22: return;
-: 23: }
-: 24:}
1: 25:int main() {
-: 26:
6: 27: for (int i = 0; i < 5; ++i) {
5: 28: process(i - 2);
-: 29: }
1: 30: return EXIT_SUCCESS;
-: 31:}
Cov of line 8 was wrongly marked as 5.