mirror of
https://github.com/github/codeql.git
synced 2025-12-16 16:53:25 +01:00
Swift: make SuccessfullyExtractedFiles.ql more precise
This is done by adding a `isSuccessfullyExtracted` predicate that is filled for primary files at the very end of the extractor invocation if the frontend was performed successfully. If for example the extractor crashes this will therefore not be filled. The upgrade script is written so that `SuccessfullyExtractedFiles.ql` on an upgraded script will give exactly the same results as before it.
This commit is contained in:
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,3 @@
|
||||
description: Revert adding file_is_successfully_extracted
|
||||
compatibility: full
|
||||
file_is_successfully_extracted.rel: delete
|
||||
@@ -30,10 +30,15 @@ void SwiftLocationExtractor::attachLocation(const swift::SourceManager& sourceMa
|
||||
trap.emit(LocatableLocationsTrap{locatableLabel, entry.id});
|
||||
}
|
||||
|
||||
void SwiftLocationExtractor::emitFile(swift::SourceFile* file) {
|
||||
TrapLabel<FileTag> SwiftLocationExtractor::emitFile(swift::SourceFile* file) {
|
||||
if (file) {
|
||||
fetchFileLabel(resolvePath(file->getFilename()));
|
||||
return emitFile(std::string_view{file->getFilename()});
|
||||
}
|
||||
return undefined_label;
|
||||
}
|
||||
|
||||
TrapLabel<FileTag> SwiftLocationExtractor::emitFile(const std::filesystem::path& file) {
|
||||
return fetchFileLabel(resolvePath(file));
|
||||
}
|
||||
|
||||
void SwiftLocationExtractor::attachLocation(const swift::SourceManager& sourceManager,
|
||||
|
||||
@@ -18,7 +18,8 @@ class SwiftLocationExtractor {
|
||||
public:
|
||||
explicit SwiftLocationExtractor(TrapDomain& trap) : trap(trap) {}
|
||||
|
||||
void emitFile(swift::SourceFile* file);
|
||||
TrapLabel<FileTag> emitFile(swift::SourceFile* file);
|
||||
TrapLabel<FileTag> emitFile(const std::filesystem::path& file);
|
||||
|
||||
template <typename Locatable>
|
||||
void attachLocation(const swift::SourceManager& sourceManager,
|
||||
|
||||
@@ -95,6 +95,14 @@ class Observer : public swift::FrontendObserver {
|
||||
codeql::extractExtractLazyDeclarations(state, compiler);
|
||||
}
|
||||
|
||||
void markSuccessfullyExtractedFiles() {
|
||||
codeql::SwiftLocationExtractor locExtractor{invocationTrap};
|
||||
for (const auto& src : state.sourceFiles) {
|
||||
auto fileLabel = locExtractor.emitFile(src);
|
||||
invocationTrap.emit(codeql::FileIsSuccessfullyExtractedTrap{fileLabel});
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
codeql::SwiftExtractorState state;
|
||||
codeql::TrapDomain invocationTrap{invocationTrapDomain(state)};
|
||||
@@ -195,5 +203,9 @@ int main(int argc, char** argv) {
|
||||
int frontend_rc = swift::performFrontend(configuration.frontendOptions, "swift-extractor",
|
||||
(void*)main, &observer);
|
||||
|
||||
if (frontend_rc == 0) {
|
||||
observer.markSuccessfullyExtractedFiles();
|
||||
}
|
||||
|
||||
return frontend_rc;
|
||||
}
|
||||
|
||||
@@ -378,14 +378,14 @@ ql/lib/codeql/swift/generated/DbLocation.qll b9baea963d9fa82068986512c0649d10508
|
||||
ql/lib/codeql/swift/generated/Diagnostics.qll d2ee2db55e932dcaee95fcc1164a51ffbe1a78d86ee0f50aabb299b458462afe 566d554d579cadde26dc4d1d6b1750ca800511201b737b629f15b6f873af3733
|
||||
ql/lib/codeql/swift/generated/Element.qll 9caf84a1da2509f5b01a22d6597126c573ae63ec3e8c6af6fd6fcc7ead0b4e82 70deb2238509d5ed660369bf763c796065d92efd732469088cdf67f68bacd796
|
||||
ql/lib/codeql/swift/generated/ErrorElement.qll 4b032abe8ffb71376a29c63e470a52943ace2527bf7b433c97a8bf716f9ad102 4f2b1be162a5c275e3264dbc51bf98bce8846d251be8490a0d4b16cbc85f630f
|
||||
ql/lib/codeql/swift/generated/File.qll 61454459f5f1ae378bd4970ad1da4f39f3e696bac8a5eebdd162f131995c5316 3e6805f8858cd55dd0e0d0e5aeab923d6a55292dbf98b0029db1ae0208efe684
|
||||
ql/lib/codeql/swift/generated/File.qll f88c485883dd9b2b4a366080e098372912e03fb3177e5cae58aa4449c2b03399 0333c49e3a11c48e6146a7f492ee31ac022d80150fc3f8bfafc3c8f94d66ff76
|
||||
ql/lib/codeql/swift/generated/Locatable.qll bdc98b9fb7788f44a4bf7e487ee5bd329473409950a8e9f116d61995615ad849 0b36b4fe45e2aa195e4bb70c50ea95f32f141b8e01e5f23466c6427dd9ab88fb
|
||||
ql/lib/codeql/swift/generated/Location.qll 851766e474cdfdfa67da42e0031fc42dd60196ff5edd39d82f08d3e32deb84c1 b29b2c37672f5acff15f1d3c5727d902f193e51122327b31bd27ec5f877bca3b
|
||||
ql/lib/codeql/swift/generated/OtherAvailabilitySpec.qll 0e26a203b26ff0581b7396b0c6d1606feec5cc32477f676585cdec4911af91c5 0e26a203b26ff0581b7396b0c6d1606feec5cc32477f676585cdec4911af91c5
|
||||
ql/lib/codeql/swift/generated/ParentChild.qll 87c955fbd71e8c720b306b8dc43db354a120a4f984404f83b4dfea4dc8969380 6f7464ecd8ca04b6aa261139b36a162e5b0636237d514b8431ef4f97a1c603dc
|
||||
ql/lib/codeql/swift/generated/ParentChild.qll 0ac2139b8b2e172858262d80950a0212b21fe46bf6af7259d9058fb7193f8242 6f7464ecd8ca04b6aa261139b36a162e5b0636237d514b8431ef4f97a1c603dc
|
||||
ql/lib/codeql/swift/generated/PlatformVersionAvailabilitySpec.qll f82d9ca416fe8bd59b5531b65b1c74c9f317b3297a6101544a11339a1cffce38 7f5c6d3309e66c134107afe55bae76dfc9a72cb7cdd6d4c3706b6b34cee09fa0
|
||||
ql/lib/codeql/swift/generated/PureSynthConstructors.qll 173c0dd59396a1de26fe870e3bc2766c46de689da2a4d8807cb62023bbce1a98 173c0dd59396a1de26fe870e3bc2766c46de689da2a4d8807cb62023bbce1a98
|
||||
ql/lib/codeql/swift/generated/Raw.qll 180dc0f5d34c2e88eb864dca9ef4be0a768583fdad98e737716e031caa355a39 8561938ad09551dc45ad6b3946d599fce1839985a6f61cee63a6dd463dd14a12
|
||||
ql/lib/codeql/swift/generated/Raw.qll efe60f045f8a4aecedd7bfe8110c0c10539bcdcb9f17f342cf560c8d065e6aff 261825907250bb4ddeba8ccce0df29b45f13c6fb338eb41a06ea6b43e7aa9788
|
||||
ql/lib/codeql/swift/generated/Synth.qll af02e0b49fe7b488592687996cc74d9525d4e3fbc9d324820b310b356f4d2612 5c740a660721173e9e4e45eb701d373ca19ff14d61cdaea309b65871e0deea90
|
||||
ql/lib/codeql/swift/generated/SynthConstructors.qll a1b3ca33017f82124286ccad317a05484fee144fb9c3cdd2e500ce38e5efcec4 a1b3ca33017f82124286ccad317a05484fee144fb9c3cdd2e500ce38e5efcec4
|
||||
ql/lib/codeql/swift/generated/UnknownFile.qll 0fcf9beb8de79440bcdfff4bb6ab3dd139bd273e6c32754e05e6a632651e85f6 0fcf9beb8de79440bcdfff4bb6ab3dd139bd273e6c32754e05e6a632651e85f6
|
||||
@@ -661,7 +661,7 @@ ql/test/extractor-tests/generated/AvailabilityInfo/AvailabilityInfo.ql 6e06e2226
|
||||
ql/test/extractor-tests/generated/AvailabilityInfo/AvailabilityInfo_getSpec.ql 44ccccad28d8648aa3349d9290bd1478bb021797c26bc2f8c1e3de14a42be3bd aefab61b6fa1c06c5c79d337cffb61335dca74ef9906deba12f7eaea42f9ac14
|
||||
ql/test/extractor-tests/generated/Comment/MISSING_SOURCE.txt 66846d526b0bc4328735c3c4dd9c390a9325da5b5dfd42ec07622f9c7108a7d7 66846d526b0bc4328735c3c4dd9c390a9325da5b5dfd42ec07622f9c7108a7d7
|
||||
ql/test/extractor-tests/generated/Diagnostics/Diagnostics.ql 6a4a9480cc929381e0337b181e5ac519a7abc6d597ebe24fb6701acf79ced86f 199c5bf8bd38e161d989e0e4db1ea1d3ddcb4d7cf571afd9112ce3ed8d9b8d2a
|
||||
ql/test/extractor-tests/generated/File/File.ql ab0968ae31b749da2b66462bd04e4dfb30604dba405a84594b575abfc4fa4c35 bcc0ff648b28c5ecd567e196e700272883756bbcc65296bbb880a979e3162628
|
||||
ql/test/extractor-tests/generated/File/File.ql 17a26e4f8aeaf3d4a38e6eb18f5d965cd62b63671b84edcd068808b4f3a999df 009a1338750bf95f715b303ac3e6a6e827c82aec2068299a97b0585ce76e9239
|
||||
ql/test/extractor-tests/generated/OtherAvailabilitySpec/MISSING_SOURCE.txt 66846d526b0bc4328735c3c4dd9c390a9325da5b5dfd42ec07622f9c7108a7d7 66846d526b0bc4328735c3c4dd9c390a9325da5b5dfd42ec07622f9c7108a7d7
|
||||
ql/test/extractor-tests/generated/PlatformVersionAvailabilitySpec/MISSING_SOURCE.txt 66846d526b0bc4328735c3c4dd9c390a9325da5b5dfd42ec07622f9c7108a7d7 66846d526b0bc4328735c3c4dd9c390a9325da5b5dfd42ec07622f9c7108a7d7
|
||||
ql/test/extractor-tests/generated/decl/AccessorDecl/AccessorDecl.ql 5c017af7e6b16ee68990eec12affe81eb114338bac4d445f4b231fe0f110eccc db86c828a892b0acd150a780914e7e48c280cad473d3680a453bdee03aee1e9d
|
||||
|
||||
@@ -9,5 +9,12 @@ module Generated {
|
||||
* Gets the name of this file.
|
||||
*/
|
||||
string getName() { result = Synth::convertFileToRaw(this).(Raw::File).getName() }
|
||||
|
||||
/**
|
||||
* Holds if this file is successfully extracted.
|
||||
*/
|
||||
predicate isSuccessfullyExtracted() {
|
||||
Synth::convertFileToRaw(this).(Raw::File).isSuccessfullyExtracted()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,6 +42,11 @@ module Raw {
|
||||
* Gets the name of this file.
|
||||
*/
|
||||
string getName() { files(this, result) }
|
||||
|
||||
/**
|
||||
* Holds if this file is successfully extracted.
|
||||
*/
|
||||
predicate isSuccessfullyExtracted() { file_is_successfully_extracted(this) }
|
||||
}
|
||||
|
||||
class Locatable extends @locatable, Element {
|
||||
|
||||
@@ -72,6 +72,11 @@ files(
|
||||
string name: string ref
|
||||
);
|
||||
|
||||
#keyset[id]
|
||||
file_is_successfully_extracted(
|
||||
int id: @file ref
|
||||
);
|
||||
|
||||
@locatable =
|
||||
@argument
|
||||
| @ast_node
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
class Element extends @element {
|
||||
string toString() { none() }
|
||||
}
|
||||
|
||||
from Element file, string filename
|
||||
where
|
||||
db_files(file) and
|
||||
files(file, filename) and
|
||||
filename.matches("%.swift") and
|
||||
not exists(Element error, Element loc |
|
||||
diagnostics(error, _, 4) and
|
||||
locatable_locations(error, loc) and
|
||||
locations(loc, file, _, _, _, _)
|
||||
)
|
||||
select file
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,3 @@
|
||||
description: Add file_is_successfully_extracted
|
||||
compatibility: backwards
|
||||
file_is_successfully_extracted.rel: run file_is_successfully_extracted.ql
|
||||
@@ -9,7 +9,5 @@
|
||||
import swift
|
||||
|
||||
from File f
|
||||
where
|
||||
not exists(CompilerError e | e.getFile() = f) and
|
||||
f.getBaseName().regexpMatch(".*\\.swift\\z")
|
||||
where f.isSuccessfullyExtracted()
|
||||
select f, "File successfully extracted."
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
| empty.swift:0:0:0:0 | empty.swift | DbFile | getName: | empty.swift |
|
||||
| file://:0:0:0:0 | | UnknownFile | getName: | |
|
||||
| non_empty.swift:0:0:0:0 | non_empty.swift | DbFile | getName: | non_empty.swift |
|
||||
| empty.swift:0:0:0:0 | empty.swift | DbFile | getName: | empty.swift | isSuccessfullyExtracted: | yes |
|
||||
| error.swift:0:0:0:0 | error.swift | DbFile | getName: | error.swift | isSuccessfullyExtracted: | no |
|
||||
| file://:0:0:0:0 | | UnknownFile | getName: | | isSuccessfullyExtracted: | no |
|
||||
| non_empty.swift:0:0:0:0 | non_empty.swift | DbFile | getName: | non_empty.swift | isSuccessfullyExtracted: | yes |
|
||||
|
||||
@@ -2,9 +2,13 @@
|
||||
import codeql.swift.elements
|
||||
import TestUtils
|
||||
|
||||
from File x, string getName
|
||||
from File x, string getName, string isSuccessfullyExtracted
|
||||
where
|
||||
toBeTested(x) and
|
||||
not x.isUnknown() and
|
||||
getName = x.getName()
|
||||
select x, x.getPrimaryQlClasses(), "getName:", getName
|
||||
getName = x.getName() and
|
||||
if x.isSuccessfullyExtracted()
|
||||
then isSuccessfullyExtracted = "yes"
|
||||
else isSuccessfullyExtracted = "no"
|
||||
select x, x.getPrimaryQlClasses(), "getName:", getName, "isSuccessfullyExtracted:",
|
||||
isSuccessfullyExtracted
|
||||
|
||||
2
swift/ql/test/extractor-tests/generated/File/error.swift
Normal file
2
swift/ql/test/extractor-tests/generated/File/error.swift
Normal file
@@ -0,0 +1,2 @@
|
||||
//codeql-extractor-expected-status: 1
|
||||
#error("Uh oh")
|
||||
@@ -20,6 +20,7 @@ class Element:
|
||||
@qltest.collapse_hierarchy
|
||||
class File(Element):
|
||||
name: string
|
||||
is_successfully_extracted: predicate | cpp.skip
|
||||
|
||||
@qltest.skip
|
||||
@qltest.collapse_hierarchy
|
||||
|
||||
Reference in New Issue
Block a user