diff --git a/Podfile.lock b/Podfile.lock index b58985c4f..1737f1557 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -136,7 +136,7 @@ CHECKOUT OPTIONS: :commit: 7054e4b13ee5bcd6d524adb6dc9a726e8c466308 :git: https://github.com/WhisperSystems/JSQMessagesViewController.git SignalServiceKit: - :commit: 24c84cbbad8d531951034c6e1902ac8cc4a45ead + :commit: f078f8adc246d882d78d5b287c0dccc23ec4ce61 :git: https://github.com/WhisperSystems/SignalServiceKit.git SocketRocket: :commit: 877ac7438be3ad0b45ef5ca3969574e4b97112bf diff --git a/Signal.xcodeproj/project.pbxproj b/Signal.xcodeproj/project.pbxproj index 87390efa5..76676f894 100644 --- a/Signal.xcodeproj/project.pbxproj +++ b/Signal.xcodeproj/project.pbxproj @@ -1683,7 +1683,7 @@ attributes = { LastSwiftUpdateCheck = 0720; LastTestingUpgradeCheck = 0600; - LastUpgradeCheck = 0720; + LastUpgradeCheck = 0830; ORGANIZATIONNAME = "Open Whisper Systems"; TargetAttributes = { D221A088169C9E5E00537ABF = { @@ -2301,6 +2301,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; @@ -2309,14 +2310,19 @@ CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_RECEIVER_WEAK = YES; CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__ARC_BRIDGE_CAST_NONARC = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; ENABLE_BITCODE = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + GCC_NO_COMMON_BLOCKS = YES; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", @@ -2360,6 +2366,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; @@ -2368,13 +2375,18 @@ CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_IMPLICIT_SIGN_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; CLANG_WARN_OBJC_RECEIVER_WEAK = YES; CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__ARC_BRIDGE_CAST_NONARC = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Distribution"; ENABLE_BITCODE = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES; GCC_TREAT_INCOMPATIBLE_POINTER_TYPE_WARNINGS_AS_ERRORS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -2409,6 +2421,7 @@ "-fobjc-arc-exceptions", ); SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; VALIDATE_PRODUCT = YES; }; name = "App Store Release"; @@ -2641,7 +2654,7 @@ PRODUCT_NAME = SignalTests; PROVISIONING_PROFILE = ""; SWIFT_OBJC_BRIDGING_HEADER = "Signal/test/SignalTests-Bridging-Header.h"; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_VERSION = 3.0; TEST_HOST = "$(BUNDLE_LOADER)"; VALID_ARCHS = "arm64 armv7s armv7 i386 x86_64"; diff --git a/Signal.xcodeproj/xcshareddata/xcschemes/Signal.xcscheme b/Signal.xcodeproj/xcshareddata/xcschemes/Signal.xcscheme index 93ed43f60..6154f07a1 100644 --- a/Signal.xcodeproj/xcshareddata/xcschemes/Signal.xcscheme +++ b/Signal.xcodeproj/xcshareddata/xcschemes/Signal.xcscheme @@ -1,6 +1,6 @@ diff --git a/Signal/src/Jobs/MessageFetcherJob.swift b/Signal/src/Jobs/MessageFetcherJob.swift index 2a63dfcaf..6b67dea5e 100644 --- a/Signal/src/Jobs/MessageFetcherJob.swift +++ b/Signal/src/Jobs/MessageFetcherJob.swift @@ -188,7 +188,7 @@ class MessageFetcherJob: NSObject { Logger.debug("\(self.TAG) acknowledged delivery for message at timestamp: \(envelope.timestamp)") }, failure: { (_: URLSessionDataTask?, error: Error?) in - Logger.debug("\(self.TAG) acknowledging delivery for message at timestamp: \(envelope.timestamp) failed with error: \(error)") + Logger.debug("\(self.TAG) acknowledging delivery for message at timestamp: \(envelope.timestamp) failed with error: \(String(describing: error))") }) } } diff --git a/Signal/src/Models/CompareSafetyNumbersActivity.swift b/Signal/src/Models/CompareSafetyNumbersActivity.swift index b02b42998..fad060fb4 100644 --- a/Signal/src/Models/CompareSafetyNumbersActivity.swift +++ b/Signal/src/Models/CompareSafetyNumbersActivity.swift @@ -1,5 +1,6 @@ -// Created by Michael Kirk on 11/15/16. -// Copyright © 2016 Open Whisper Systems. All rights reserved. +// +// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// import Foundation @@ -7,8 +8,8 @@ let CompareSafetyNumbersActivityType = "org.whispersystems.signal.activity.Compa @objc(OWSCompareSafetyNumbersActivityDelegate) protocol CompareSafetyNumbersActivityDelegate { - func compareSafetyNumbersActivitySucceeded(activity: CompareSafetyNumbersActivity) -> Void; - func compareSafetyNumbersActivity(_ activity: CompareSafetyNumbersActivity, failedWithError error: Error) -> Void; + func compareSafetyNumbersActivitySucceeded(activity: CompareSafetyNumbersActivity) + func compareSafetyNumbersActivity(_ activity: CompareSafetyNumbersActivity, failedWithError error: Error) } @objc (OWSCompareSafetyNumbersActivity) @@ -18,7 +19,7 @@ class CompareSafetyNumbersActivity: UIActivity { var mySafetyNumbers: String? let delegate: CompareSafetyNumbersActivityDelegate - required init(delegate:CompareSafetyNumbersActivityDelegate) { + required init(delegate: CompareSafetyNumbersActivityDelegate) { self.delegate = delegate super.init() } @@ -59,7 +60,7 @@ class CompareSafetyNumbersActivity: UIActivity { let pasteboardString = numericOnly(string: UIPasteboard.general.string) guard (pasteboardString != nil && pasteboardString!.characters.count == 60) else { - Logger.warn("\(TAG) no valid safety numbers found in pasteboard: \(pasteboardString)") + Logger.warn("\(TAG) no valid safety numbers found in pasteboard: \(String(describing: pasteboardString))") let error = OWSErrorWithCodeDescription(OWSErrorCode.userError, NSLocalizedString("PRIVACY_VERIFICATION_FAILED_NO_SAFETY_NUMBERS_IN_CLIPBOARD", comment: "Alert body for user error")) @@ -70,10 +71,10 @@ class CompareSafetyNumbersActivity: UIActivity { let pasteboardSafetyNumbers = pasteboardString! if pasteboardSafetyNumbers == mySafetyNumbers { - Logger.info("\(TAG) successfully matched safety numbers. local numbers: \(mySafetyNumbers) pasteboard:\(pasteboardSafetyNumbers)") + Logger.info("\(TAG) successfully matched safety numbers. local numbers: \(String(describing: mySafetyNumbers)) pasteboard:\(pasteboardSafetyNumbers)") delegate.compareSafetyNumbersActivitySucceeded(activity:self) } else { - Logger.warn("\(TAG) local numbers: \(mySafetyNumbers) didn't match pasteboard:\(pasteboardSafetyNumbers)") + Logger.warn("\(TAG) local numbers: \(String(describing: mySafetyNumbers)) didn't match pasteboard:\(pasteboardSafetyNumbers)") let error = OWSErrorWithCodeDescription(OWSErrorCode.privacyVerificationFailure, NSLocalizedString("PRIVACY_VERIFICATION_FAILED_MISMATCHED_SAFETY_NUMBERS_IN_CLIPBOARD", comment: "Alert body")) delegate.compareSafetyNumbersActivity(self, failedWithError: error) diff --git a/Signal/src/ViewControllers/CallViewController.swift b/Signal/src/ViewControllers/CallViewController.swift index bd14b7095..8544f0181 100644 --- a/Signal/src/ViewControllers/CallViewController.swift +++ b/Signal/src/ViewControllers/CallViewController.swift @@ -868,10 +868,8 @@ class CallViewController: UIViewController, CallObserver, CallServiceObserver, R self.localVideoTrack = localVideoTrack - var source: RTCAVFoundationVideoSource? - if localVideoTrack?.source is RTCAVFoundationVideoSource { - source = localVideoTrack?.source as! RTCAVFoundationVideoSource - } + let source = localVideoTrack?.source as? RTCAVFoundationVideoSource + localVideoView.captureSession = source?.captureSession let isHidden = source == nil Logger.info("\(TAG) \(#function) isHidden: \(isHidden)") diff --git a/Signal/src/ViewControllers/ContactsPicker.swift b/Signal/src/ViewControllers/ContactsPicker.swift index 092523947..1c8297e45 100644 --- a/Signal/src/ViewControllers/ContactsPicker.swift +++ b/Signal/src/ViewControllers/ContactsPicker.swift @@ -347,7 +347,7 @@ fileprivate extension CNContact { @objc var nameForCollating: String { get { if self.familyName.isEmpty && self.givenName.isEmpty { - return self.emailAddresses.first?.value as? String ?? "" + return self.emailAddresses.first?.value as String? ?? "" } let compositeName: String diff --git a/Signal/src/ViewControllers/SignalAttachment.swift b/Signal/src/ViewControllers/SignalAttachment.swift index e4f38f65d..4ac5b27b5 100644 --- a/Signal/src/ViewControllers/SignalAttachment.swift +++ b/Signal/src/ViewControllers/SignalAttachment.swift @@ -80,7 +80,7 @@ class SignalAttachment: NSObject { AssertIsOnMainThread() assert(oldValue == nil) - Logger.verbose("\(SignalAttachment.TAG) Attachment has error: \(error)") + Logger.verbose("\(SignalAttachment.TAG) Attachment has error: \(String(describing: error))") } } diff --git a/Signal/src/call/CallAudioService.swift b/Signal/src/call/CallAudioService.swift index 7f73df383..be387e2ed 100644 --- a/Signal/src/call/CallAudioService.swift +++ b/Signal/src/call/CallAudioService.swift @@ -308,7 +308,7 @@ import AVFoundation Logger.debug("\(self.TAG) set category: \(category) options: \(options)") } } catch { - let message = "\(self.TAG) in \(#function) failed to set category: \(category) mode: \(mode), options: \(options) with error: \(error)" + let message = "\(self.TAG) in \(#function) failed to set category: \(category) mode: \(String(describing: mode)), options: \(options) with error: \(error)" assertionFailure(message) Logger.error(message) } diff --git a/Signal/src/call/CallService.swift b/Signal/src/call/CallService.swift index a5145e008..38aac0558 100644 --- a/Signal/src/call/CallService.swift +++ b/Signal/src/call/CallService.swift @@ -125,7 +125,7 @@ protocol CallServiceObserver: class { didSet { AssertIsOnMainThread() - Logger.debug("\(self.TAG) .peerConnectionClient setter: \(oldValue != nil) -> \(peerConnectionClient != nil) \(peerConnectionClient)") + Logger.debug("\(self.TAG) .peerConnectionClient setter: \(oldValue != nil) -> \(peerConnectionClient != nil) \(String(describing: peerConnectionClient))") } } @@ -141,7 +141,7 @@ protocol CallServiceObserver: class { updateIsVideoEnabled() updateLockTimerEnabling() - Logger.debug("\(self.TAG) .call setter: \(oldValue != nil) -> \(call != nil) \(call)") + Logger.debug("\(self.TAG) .call setter: \(oldValue != nil) -> \(call != nil) \(String(describing: call))") for observer in observers { observer.value?.didUpdateCall(call:call) @@ -688,7 +688,7 @@ protocol CallServiceObserver: class { guard thread.contactIdentifier() == self.thread?.contactIdentifier() else { // This can safely be ignored. // We don't want to fail the current call because an old call was slow to send us the hangup message. - Logger.warn("\(TAG) ignoring hangup for thread:\(thread) which is not the current thread: \(self.thread)") + Logger.warn("\(TAG) ignoring hangup for thread:\(thread) which is not the current thread: \(String(describing: self.thread))") return } diff --git a/Signal/src/util/StringUtil.h b/Signal/src/util/StringUtil.h index c7b6a9d79..0811f9b1d 100644 --- a/Signal/src/util/StringUtil.h +++ b/Signal/src/util/StringUtil.h @@ -1,3 +1,7 @@ +// +// Copyright (c) 2017 Open Whisper Systems. All rights reserved. +// + #import @interface NSString (Util) @@ -11,11 +15,9 @@ - (NSString *)withMatchesAgainst:(NSRegularExpression *)regex replacedBy:(NSString *)replacement; - (bool)containsAnyMatches:(NSRegularExpression *)regex; - (NSString *)withPrefixRemovedElseNull:(NSString *)prefix; -- (NSData *)decodedAsJsonIntoData; + - (NSDictionary *)decodedAsJsonIntoDictionary; -- (NSData *)decodedAsHexString; -- (NSData *)decodedAsSpaceSeparatedHexString; -- (NSData *)decodedAsBase64Data; + - (NSNumber *)tryParseAsDecimalNumber; - (NSNumber *)tryParseAsUnsignedInteger; - (NSString *)removeAllCharactersIn:(NSCharacterSet *)characterSet; diff --git a/Signal/src/util/StringUtil.m b/Signal/src/util/StringUtil.m index f13ce1624..625784f69 100644 --- a/Signal/src/util/StringUtil.m +++ b/Signal/src/util/StringUtil.m @@ -6,20 +6,7 @@ #import "StringUtil.h" @implementation NSString (Util) -- (NSData *)decodedAsHexString { - ows_require(self.length % 2 == 0); - NSUInteger n = self.length / 2; - uint8_t result[n]; - for (NSUInteger i = 0; i < n; i++) { - unsigned int r; - NSScanner *scanner = [NSScanner scannerWithString:[self substringWithRange:NSMakeRange(i * 2, 2)]]; - checkOperation([scanner scanHexInt:&r]); - checkOperation(r < 256); - result[i] = (uint8_t)r; - } - return [NSData dataWithBytes:result length:sizeof(result)]; -} - (NSData *)encodedAsUtf8 { NSData *result = [self dataUsingEncoding:NSUTF8StringEncoding]; checkOperationDescribe(result != nil, @"Not a UTF8 string."); @@ -54,13 +41,6 @@ return nil; return [self substringFromIndex:prefix.length]; } -- (NSData *)decodedAsJsonIntoData { - NSError *jsonParseError = nil; - id parsedJson = [NSJSONSerialization dataWithJSONObject:self.encodedAsUtf8 options:0 error:&jsonParseError]; - checkOperationDescribe(jsonParseError == nil, ([NSString stringWithFormat:@"Invalid json: %@", self])); - checkOperationDescribe([parsedJson isKindOfClass:NSData.class], @"Unexpected json data"); - return parsedJson; -} - (NSDictionary *)decodedAsJsonIntoDictionary { NSError *jsonParseError = nil; id parsedJson = [NSJSONSerialization JSONObjectWithData:self.encodedAsUtf8 options:0 error:&jsonParseError];