Skip to content

Commit 30557eb

Browse files
committed
Swift: Test for string length conflation query.
1 parent ca3d722 commit 30557eb

File tree

3 files changed

+86
-0
lines changed

3 files changed

+86
-0
lines changed

swift/ql/test/query-tests/Security/CWE-135/StringLengthConflation.expected

Whitespace-only changes.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
queries/Security/CWE-135/StringLengthConflation.ql
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
2+
func test(s: String) {
3+
/*let ns = NSString(string: s)
4+
let nms = NSString(string: s)
5+
6+
print("'\(s)'")
7+
print("count \(s.count) length \(ns.length)")
8+
print("utf8.count \(s.utf8.count) utf16.count \(s.utf16.count) unicodeScalars.count \(s.unicodeScalars.count)")
9+
10+
// --- constructing a String.Index from integer ---
11+
12+
let ix1 = String.Index(encodedOffset: s.count) // GOOD
13+
let ix2 = String.Index(encodedOffset: ns.length) // BAD: NSString length used in String.Index
14+
let ix3 = String.Index(encodedOffset: s.utf8.count) // BAD: String.utf8 length used in String.Index
15+
let ix4 = String.Index(encodedOffset: s.utf16.count) // BAD: String.utf16 length used in String.Index
16+
let ix5 = String.Index(encodedOffset: s.unicodeScalars.count) // BAD: string.unicodeScalars length used in String.Index
17+
print("String.Index '\(ix1.encodedOffset)' / '\(ix2.encodedOffset)' '\(ix3.encodedOffset)' '\(ix4.encodedOffset)' '\(ix5.encodedOffset)'")
18+
19+
let ix6 = s.index(s.startIndex, offsetBy: s.count / 2) // GOOD
20+
let ix7 = s.index(s.startIndex, offsetBy: ns.length / 2) // BAD: NSString length used in String.Index
21+
print("index '\(ix6.encodedOffset)' / '\(ix7.encodedOffset)'")
22+
23+
var ix8 = s.startIndex
24+
s.formIndex(&ix8, offsetBy: s.count / 2) // GOOD
25+
var ix9 = s.startIndex
26+
s.formIndex(&ix9, offsetBy: ns.length / 2) // BAD: NSString length used in String.Index
27+
print("formIndex '\(ix8.encodedOffset)' / '\(ix9.encodedOffset)'")
28+
29+
// --- constructing an NSRange from integers ---
30+
31+
let range1 = NSMakeRange(0, ns.length) // GOOD
32+
let range2 = NSMakeRange(0, s.count) // BAD: String length used in NSMakeRange
33+
let range3 = NSMakeRange(0, s.reversed().count) // BAD: String length used in NSMakeRange
34+
let range4 = NSMakeRange(0, s.distance(from: s.startIndex, to: s.endIndex)) // BAD: String length used in NSMakeRange
35+
print("NSMakeRange '\(range1.description)' / '\(range2.description)' '\(range3.description)' '\(range4.description)'")
36+
37+
let range5 = NSRange(location: 0, length: ns.length) // GOOD
38+
let range6 = NSRange(location: 0, length: s.count) // BAD: String length used in NSMakeRange
39+
print("NSRange '\(range5.description)' / '\(range6.description)'")
40+
41+
// --- String operations using an integer directly ---
42+
43+
let str1 = s.dropFirst(s.count - 1) // GOOD
44+
let str2 = s.dropFirst(ns.length - 1) // BAD: NSString length used in String
45+
print("dropFirst '\(str1)' / '\(str2)'")
46+
47+
let str3 = s.dropLast(s.count - 1) // GOOD
48+
let str4 = s.dropLast(ns.length - 1) // BAD: NSString length used in String
49+
print("dropLast '\(str3)' / '\(str4)'")
50+
51+
let str5 = s.prefix(s.count - 1) // GOOD
52+
let str6 = s.prefix(ns.length - 1) // BAD: NSString length used in String
53+
print("prefix '\(str5)' / '\(str6)'")
54+
55+
let str7 = s.suffix(s.count - 1) // GOOD
56+
let str8 = s.suffix(ns.length - 1) // BAD: NSString length used in String
57+
print("suffix '\(str7)' / '\(str8)'")
58+
59+
let nstr1 = ns.character(at: ns.length - 1) // GOOD
60+
let nmstr1 = nms.character(at: nms.length - 1) // GOOD
61+
let nstr2 = ns.character(at: s.count - 1) // BAD: String length used in NString
62+
let nmstr2 = nms.character(at: s.count - 1) // BAD: String length used in NString
63+
print("character '\(nstr1)' '\(nmstr1)' / '\(nstr2)' '\(nmstr2)'")
64+
65+
let nstr3 = ns.substring(from: ns.length - 1) // GOOD
66+
let nmstr3 = nms.substring(from: nms.length - 1) // GOOD
67+
let nstr4 = ns.substring(from: s.count - 1) // BAD: String length used in NString
68+
let nmstr4 = nms.substring(from: s.count - 1) // BAD: String length used in NString
69+
print("substring from '\(nstr3)' '\(nmstr3)' / '\(nstr4)' '\(nmstr4)'")
70+
71+
let nstr5 = ns.substring(to: ns.length - 1) // GOOD
72+
let nmstr5 = nms.substring(to: nms.length - 1) // GOOD
73+
let nstr6 = ns.substring(to: s.count - 1) // BAD: String length used in NString
74+
let nmstr6 = nms.substring(to: s.count - 1) // BAD: String length used in NString
75+
print("substring to '\(nstr5)' '\(nmstr5)' / '\(nstr6)' '\(nmstr6)'")
76+
77+
let nmstr7 = NSMutableString(string: s)
78+
nmstr7.insert("*", at: nms.length - 1) // GOOD
79+
let nmstr8 = NSMutableString(string: s)
80+
nmstr8.insert("*", at: s.count - 1) // BAD: String length used in NString
81+
print("insert '\(nmstr7)' / '\(nmstr8)'")*/
82+
}
83+
84+
// `begin :thumbsup: end`, with thumbs up emoji and skin tone modifier
85+
test(s: "begin \u{0001F44D}\u{0001F3FF} end")

0 commit comments

Comments
 (0)