| // RUN: %clang_analyze_cc1 \ |
| // RUN: -analyzer-checker=alpha.security.cert.pos.34c\ |
| // RUN: -verify %s |
| |
| // Examples from the CERT rule's page. |
| // https://wiki.sei.cmu.edu/confluence/x/6NYxBQ |
| |
| #include "../Inputs/system-header-simulator.h" |
| void free(void *memblock); |
| void *malloc(size_t size); |
| int putenv(char *); |
| int snprintf(char *str, size_t size, const char *format, ...); |
| |
| namespace test_auto_var_used_bad { |
| |
| int volatile_memory1(const char *var) { |
| char env[1024]; |
| int retval = snprintf(env, sizeof(env), "TEST=%s", var); |
| if (retval < 0 || (size_t)retval >= sizeof(env)) { |
| /* Handle error */ |
| } |
| |
| return putenv(env); |
| // expected-warning@-1 {{The 'putenv' function should not be called with arguments that have automatic storage}} |
| } |
| |
| } // namespace test_auto_var_used_bad |
| |
| namespace test_auto_var_used_good { |
| |
| int test_static(const char *var) { |
| static char env[1024]; |
| |
| int retval = snprintf(env, sizeof(env), "TEST=%s", var); |
| if (retval < 0 || (size_t)retval >= sizeof(env)) { |
| /* Handle error */ |
| } |
| |
| return putenv(env); |
| } |
| |
| int test_heap_memory(const char *var) { |
| static char *oldenv; |
| const char *env_format = "TEST=%s"; |
| const size_t len = strlen(var) + strlen(env_format); |
| char *env = (char *)malloc(len); |
| if (env == NULL) { |
| return -1; |
| } |
| if (putenv(env) != 0) { // no-warning: env was dynamically allocated. |
| free(env); |
| return -1; |
| } |
| if (oldenv != NULL) { |
| free(oldenv); /* avoid memory leak */ |
| } |
| oldenv = env; |
| return 0; |
| } |
| |
| } // namespace test_auto_var_used_good |