-
Notifications
You must be signed in to change notification settings - Fork 19
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Support variadic function calls in checked scope #1170
Comments
Comment from @mattmccutchen-cci: I realize I may have waited a little too late to post this, but I tested this PR and found several holes in the new checking. If you save the code below as #pragma CHECKED_SCOPE on
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#define TEST(_name) else if (strcmp(test_name, #_name) == 0)
int main(int argc, _Nt_array_ptr<_Nt_array_ptr<char>> argv : count(argc)) {
_Nt_array_ptr<char> test_name = argv[1];
if (!test_name) {
fprintf(stderr, "No test name specified\n");
return 1;
}
if (0) {}
TEST(percent_n) {
// Missing check that %n argument is a _Ptr.
int arr _Checked[1];
printf("hello\n%n", arr + 123456789);
}
TEST(scanf_scalar) {
// Missing check that _any_ scalar scanf argument is a _Ptr.
int arr _Checked[1];
sscanf("42", "%d", arr + 123456789);
}
TEST(printf_s_count) {
// Missing check that printf %s argument has at least count(0).
char buf _Nt_checked[1];
printf("%s", buf + 123456789);
}
TEST(scanf_p) {
// scanf reads an arbitrary _Ptr<void> via %p. The right solution here may
// be to disallow _Ptr<void>
// (https://github.com/microsoft/checkedc/issues/335). I couldn't find any
// other way to exploit %p, but that doesn't mean there isn't any.
_Ptr<void> q = 0;
sscanf("0x1", "%p", &q);
_Ptr<char> p = (_Ptr<char>)q;
(*p)++;
}
TEST(scanf_s_overflow) {
// scanf %s overflows the output buffer. I guess the compiler should require
// the format string to specify a maximum width and check it against the
// bounds of the argument?
char field _Nt_checked[10];
char input _Nt_checked[1000];
memset(input, 'x', sizeof input - 1);
sscanf(input, "%s", field);
}
else {
fprintf(stderr, "Unknown test name\n");
return 1;
}
return 0;
} |
Comment from @mgrang: Thanks @mattmccutchen-cci for identifying these issues. I have filed checkedc/checkedc-clang#1178 to track these. |
This issue was copied from checkedc/checkedc-clang#1174
We add support for calling variadic functions in checked scope. These are
functions like printf, scanf, etc that take a format string and have a variable
number of arguments. We implement checking of arguments to these functions.
Following is a list of some important checks that we implement in checked scope
for these functions:
null-terminated array.
errors in checked scope.
The text was updated successfully, but these errors were encountered: