diff --git a/csharp/documentation/library-coverage/cwe-sink.csv b/csharp/documentation/library-coverage/cwe-sink.csv new file mode 100644 index 00000000000..4c08fcea7f8 --- /dev/null +++ b/csharp/documentation/library-coverage/cwe-sink.csv @@ -0,0 +1,2 @@ +CWE,Sink identifier,Label +CWE-079,html,Cross-site scripting \ No newline at end of file diff --git a/csharp/documentation/library-coverage/frameworks.csv b/csharp/documentation/library-coverage/frameworks.csv new file mode 100644 index 00000000000..d0cc09b4e9c --- /dev/null +++ b/csharp/documentation/library-coverage/frameworks.csv @@ -0,0 +1,2 @@ +Framework name,URL,Namespace prefixes +System,,System.* System diff --git a/csharp/ql/src/meta/frameworks/Coverage.ql b/csharp/ql/src/meta/frameworks/Coverage.ql new file mode 100644 index 00000000000..f24d519e51d --- /dev/null +++ b/csharp/ql/src/meta/frameworks/Coverage.ql @@ -0,0 +1,14 @@ +/** + * @name Framework coverage + * @description The number of API endpoints covered by CSV models sorted by + * package and source-, sink-, and summary-kind. + * @kind table + * @id cs/meta/framework-coverage + */ + +import csharp +import semmle.code.csharp.dataflow.ExternalFlow + +from string namespace, int pkgs, string kind, string part, int n +where modelCoverage(namespace, pkgs, kind, part, n) +select namespace, pkgs, kind, part, n diff --git a/misc/scripts/library-coverage/compare.py b/misc/scripts/library-coverage/compare.py index f8bb7e9fbd6..2d8b6369840 100644 --- a/misc/scripts/library-coverage/compare.py +++ b/misc/scripts/library-coverage/compare.py @@ -24,11 +24,9 @@ def compare_folders(folder1, folder2, output_file): Compares the contents of two folders and writes the differences to the output file. """ - languages = ['java'] - return_md = "" - for lang in languages: + for lang in settings.languages: expected_files = "" generated_output_rst = settings.generated_output_rst.format( diff --git a/misc/scripts/library-coverage/create-pr.py b/misc/scripts/library-coverage/create-pr.py index fd2cb61a58d..7f21c012d1a 100644 --- a/misc/scripts/library-coverage/create-pr.py +++ b/misc/scripts/library-coverage/create-pr.py @@ -22,8 +22,7 @@ owner = repo.split('/')[0] def overwrite_files(): - languages = ['java'] - for lang in languages: + for lang in settings.languages: repo_output_rst = settings.repo_output_rst.format(language=lang) repo_output_csv = settings.repo_output_csv.format(language=lang) diff --git a/misc/scripts/library-coverage/generate-report.py b/misc/scripts/library-coverage/generate-report.py index bb5dc694fd5..c28536701cf 100644 --- a/misc/scripts/library-coverage/generate-report.py +++ b/misc/scripts/library-coverage/generate-report.py @@ -110,7 +110,9 @@ if len(sys.argv) > 2: # Languages for which we want to generate coverage reports. configs = [ utils.LanguageConfig( - "java", "Java", ".java", query_prefix + "java/ql/src/meta/frameworks/Coverage.ql") + "java", "Java", ".java", query_prefix + "java/ql/src/meta/frameworks/Coverage.ql"), + utils.LanguageConfig( + "csharp", "C#", ".cs", query_prefix + "csharp/ql/src/meta/frameworks/Coverage.ql") ] # The names of input and output files. The placeholder {language} is replaced with the language name. @@ -125,8 +127,8 @@ else: output_rst = settings.generated_output_rst output_csv = settings.generated_output_csv -for config in configs: - lang = config.lang +for lang in settings.languages: + config = [c for c in configs if c.lang == lang][0] db = "empty-" + lang ql_output = output_ql_csv.format(language=lang) utils.create_empty_database(lang, config.ext, db) diff --git a/misc/scripts/library-coverage/generate-timeseries.py b/misc/scripts/library-coverage/generate-timeseries.py index 02f0f838b50..4f60668e396 100644 --- a/misc/scripts/library-coverage/generate-timeseries.py +++ b/misc/scripts/library-coverage/generate-timeseries.py @@ -71,13 +71,16 @@ else: configs = [ utils.LanguageConfig( - "java", "Java", ".java", "java/ql/src/meta/frameworks/Coverage.ql") + "java", "Java", ".java", "java/ql/src/meta/frameworks/Coverage.ql"), + utils.LanguageConfig( + "csharp", "C#", ".cs", "csharp/ql/src/meta/frameworks/Coverage.ql") ] # todo: change this when we cover multiple languages. We should compute the SHAs # only once and not per language output_prefix = "framework-coverage-timeseries-" -for config in configs: +for lang in settings.languages: + config = [c for c in configs if c.lang == lang][0] with open(output_prefix + config.lang + ".csv", 'w', newline='') as csvfile_total: with open(output_prefix + config.lang + "-packages.csv", 'w', newline='') as csvfile_packages: csvwriter_total = csv.writer(csvfile_total) diff --git a/misc/scripts/library-coverage/settings.py b/misc/scripts/library-coverage/settings.py index ae43a0666da..180699caf7c 100644 --- a/misc/scripts/library-coverage/settings.py +++ b/misc/scripts/library-coverage/settings.py @@ -20,3 +20,5 @@ output_rst_file_name = "coverage.rst" output_csv_file_name = "coverage.csv" repo_output_rst = documentation_folder + output_rst_file_name repo_output_csv = documentation_folder + output_csv_file_name + +languages = ['java', 'csharp']