-
Notifications
You must be signed in to change notification settings - Fork 27
Open
Description
Description
This issue documents a case where the execution of a program compiled by dcc stops without providing the usual dcc explanation.
Context
This case was contrived after investigating a UNSW COMP1511 student's post on the 2024 Term 2 edstem forum (post #598). It highlights the worst case. Minor variations to the sample code exhibit varying behaviour.
Steps to Reproduce
- Compile the below code with
dcc -o dcc_no_explanation dcc_no_explanation.c - Run the program with
./dcc_no_explanationand inputyseveral times, followed by any other character to quit - The program repeatedly attempts to modify out-of-bounds elements in a 2D array
// dcc_no_explain.c
// Description: a program to repeatedly modify out-of-bounds elements in a 2D array
#include <stdio.h>
#define SIZE 10
#define START -1
#define END 0
// repeatedly modify elements in first column of array between rows START and END
void command_loop(int array[SIZE][SIZE]) {
char command;
printf("Do you want to modify out-of-bounds elements? (y/n)\n");
while (scanf(" %c", &command) == 1 && command == 'y') {
for (int i = START; i < END; i++) {
array[i][0] = 1;
}
printf("Do it again? (y/n)\n");
}
}
int main(int argc, char *argv[]) {
int array[SIZE][SIZE] = {0};
command_loop(array);
return 0;
}Expected Behavior
Ideally, the program would exit with an explanation that describes the error.
Example of expected output:
$dcc -o dcc_no_explain dcc_no_explain.c && ./dcc_no_explain
Do you really want to modify out-of-bounds elements? (y/n)
y
Runtime error: index -1 out of bounds for type 'int[10][10]'
dcc explanation: You are using an illegal array index: -1
Valid indices for an array of size 10 are 0..9
Make sure the size of your array is correct.
Make sure your array indices are correct.
Execution stopped in main() in dcc_no_explain.c at line XYZ:
etc etc.. (more explanation + gdb output of local variables)
$
Actual Behavior
The program allows repeated access to out-of-bounds elements and produces a limited error message only after the while loop terminates. This may confuse novice programmers who expect error messages to appear immediately or close to the point where the error occurs.
Example of actual output:
$dcc -o dcc_no_explain dcc_no_explain.c && ./dcc_no_explain
Do you really want to modify out-of-bounds elements? (y/n)
y
Do it again? (y/n)
y
Do it again? (y/n)
y
Do it again? (y/n)
n
Execution stopped because of an invalid pointer or string.
$
Screenshots or Logs
N/A
Environment
Linux 6.1.0-23-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.99-1 (2024-07-15) GNU/Linux
dcc version 2.35
Metadata
Metadata
Assignees
Labels
No labels