Same C program I just made a post about 'undefined behavior' on.
I just noticed I get "stack smashing detected" only when I run the program using a dataset of 75+ consecutive integers.
set of 2 to 74 consecutive values: no problem.
set of random values of any size: no problem.
75+ consecutive values: problem
Any easy way to find out what's causing this issue (probably a buffer overflow)?
DFS <nospam@dfs.com> writes:
Same C program I just made a post about 'undefined behavior' on.
I just noticed I get "stack smashing detected" only when I run the program >> using a dataset of 75+ consecutive integers.
set of 2 to 74 consecutive values: no problem.
set of random values of any size: no problem.
75+ consecutive values: problem
Any easy way to find out what's causing this issue (probably a buffer
overflow)?
I compiled using -fsanitize=undefined and at runtime I get:
$ ./dfs 70 -c
70 Consecutive:
No commas : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
dfs.c:126:18: runtime error: index 70 out of bounds for type 'int [*]'
...
Line 126:
if(nums[i]-nums[i+1]!=0) {ucnt=1;} else {ucnt++;}
nums is a VLA declared int nums[N];
and i runs from 0 to i < N (70 in
this run). When i == 69 (the max) nums[i+1] is undefined (it's out of bounds).
If I run
$ ./dfs 1 -c
1 Consecutive:
No commas : 1
dfs.c:126:18: runtime error: index 1 out of bounds for type 'int [*]' dfs.c:161:14: runtime error: index -1 out of bounds for type 'int [*]' dfs.c:162:32: runtime error: index 1 out of bounds for type 'int [*]'
I see two further problems.
With some stats you will have to set a
minimum for N, but the first problem is just an incorrect index.
BTW, when I was starting out, I'd give my right arm for gcc's -fsanitize=undefined and/or valgrind.
On 6/12/2024 7:36 PM, Ben Bacarisse wrote:
DFS <nospam@dfs.com> writes:
Same C program I just made a post about 'undefined behavior' on.I compiled using -fsanitize=undefined and at runtime I get:
I just noticed I get "stack smashing detected" only when I run the program >>> using a dataset of 75+ consecutive integers.
set of 2 to 74 consecutive values: no problem.
set of random values of any size: no problem.
75+ consecutive values: problem
Any easy way to find out what's causing this issue (probably a buffer
overflow)?
$ ./dfs 70 -c
70 Consecutive:
No commas : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
69 70
dfs.c:126:18: runtime error: index 70 out of bounds for type 'int [*]'
...
Line 126:
if(nums[i]-nums[i+1]!=0) {ucnt=1;} else {ucnt++;}
nums is a VLA declared int nums[N];
int nums[N] is OK isn't it, if I'm not running huge datasets?
or should you always malloc:
int *nums = malloc(N * sizeof(int));
and i runs from 0 to i < N (70 in
this run). When i == 69 (the max) nums[i+1] is undefined (it's out of
bounds).
Good catch. Fixed.
The code worked even with that bug - it always correctly identifies the mode(s), according to that website. But I probably got lucky and the
mode(s) weren't the last data point.
If I run
$ ./dfs 1 -c
1 Consecutive:
No commas : 1
dfs.c:126:18: runtime error: index 1 out of bounds for type 'int [*]'
dfs.c:161:14: runtime error: index -1 out of bounds for type 'int [*]'
dfs.c:162:32: runtime error: index 1 out of bounds for type 'int [*]'
Yeah, I did very little arg validation.
I see two further problems.
What are they?
With some stats you will have to set a
minimum for N, but the first problem is just an incorrect index.
BTW, when I was starting out, I'd give my right arm for gcc's
-fsanitize=undefined and/or valgrind.
I just tried -fsanitize=undefined and got that error. Is that new in
gcc?
valgrind is too hardcore for me (for the hobby C programs I write
anyway).
Thanks for looking into it.
On 13/06/2024 09:54, Ben Bacarisse wrote:
valgrind is too hardcore for me (for the hobby C programs I write
anyway).
What does "too hardcore" mean? It's very simple to use and catches more
problems than gcc's runtime checks can. Compile with -g (so you get
line number information) and then run under valgrind:
valgrind is my favourite little utility. It's easy to use, and flushes
out bugs very effectively. Unfotunately the Mac won't let me run it
Sysop: | Keyop |
---|---|
Location: | Huddersfield, West Yorkshire, UK |
Users: | 546 |
Nodes: | 16 (2 / 14) |
Uptime: | 152:23:49 |
Calls: | 10,383 |
Files: | 14,054 |
Messages: | 6,417,816 |