diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/TestBase.qll b/cpp/ql/test/library-tests/dataflow/dataflow-tests/TestBase.qll index b9213a71549..e28d19133c7 100644 --- a/cpp/ql/test/library-tests/dataflow/dataflow-tests/TestBase.qll +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/TestBase.qll @@ -124,7 +124,11 @@ module IRTest { /** Common data flow configuration to be used by tests. */ module IRTestAllocationConfig implements DataFlow::ConfigSig { + private import semmle.code.cpp.security.FlowSources + predicate isSource(DataFlow::Node source) { + source instanceof FlowSource + or source.asExpr().(FunctionCall).getTarget().getName() = "source" or source.asIndirectExpr(1).(FunctionCall).getTarget().getName() = "indirect_source" diff --git a/cpp/ql/test/library-tests/dataflow/dataflow-tests/winmain.cpp b/cpp/ql/test/library-tests/dataflow/dataflow-tests/winmain.cpp new file mode 100644 index 00000000000..3db41088842 --- /dev/null +++ b/cpp/ql/test/library-tests/dataflow/dataflow-tests/winmain.cpp @@ -0,0 +1,9 @@ +void sink(char); +void sink(char*); + +int WinMain(void *hInstance, void *hPrevInstance, char *pCmdLine, int nCmdShow) { // $ ast-def=hInstance ast-def=hPrevInstance ast-def=pCmdLine ir-def=*hInstance ir-def=*hPrevInstance ir-def=*pCmdLine + sink(pCmdLine); + sink(*pCmdLine); // $ MISSING: ir + + return 0; +} diff --git a/cpp/ql/test/library-tests/dataflow/external-models/windows.cpp b/cpp/ql/test/library-tests/dataflow/external-models/windows.cpp new file mode 100644 index 00000000000..33f496be0f0 --- /dev/null +++ b/cpp/ql/test/library-tests/dataflow/external-models/windows.cpp @@ -0,0 +1,31 @@ +void sink(char); +void sink(char*); +void sink(char**); + +char* GetCommandLineA(); +char** CommandLineToArgvA(char*, int*); +char* GetEnvironmentStringsA(); +int GetEnvironmentVariableA(const char*, char*, int); + +void getCommandLine() { + char* cmd = GetCommandLineA(); + sink(cmd); + sink(*cmd); // $ MISSING: ir + + int argc; + char** argv = CommandLineToArgvA(cmd, &argc); + sink(argv); + sink(argv[1]); + sink(*argv[1]); // $ MISSING: ir +} + +void getEnvironment() { + char* env = GetEnvironmentStringsA(); + sink(env); + sink(*env); // $ MISSING: ir + + char buf[1024]; + GetEnvironmentVariableA("FOO", buf, sizeof(buf)); + sink(buf); + sink(*buf); // $ MISSING: ir +}