diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index e7f6d02c6..1759f3e35 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -4,7 +4,7 @@ on: [pull_request] jobs: analyze: - runs-on: macos-latest + runs-on: macos-11 env: # Infer 1.0.1 cannot parse the iOS 15 SDK headers DEVELOPER_DIR: /Applications/Xcode_12.5.1.app @@ -23,7 +23,7 @@ jobs: run: make oclint danger: - runs-on: macos-latest + runs-on: macos-11 steps: - name: Checkout target branch uses: actions/checkout@v2 diff --git a/Bugsnag/Helpers/BSGRunContext.m b/Bugsnag/Helpers/BSGRunContext.m index 50742b339..420eb15be 100644 --- a/Bugsnag/Helpers/BSGRunContext.m +++ b/Bugsnag/Helpers/BSGRunContext.m @@ -31,7 +31,6 @@ atomic_store((_Atomic(typeof(field)) *)&field, newValue_); \ } while (0) - #pragma mark Forward declarations static uint64_t GetBootTime(void); @@ -342,9 +341,11 @@ void BSGRunContextUpdateTimestamp() { } static void UpdateHostMemory() { - static mach_port_t host; + static _Atomic mach_port_t host_atomic = 0; + mach_port_t host = atomic_load(&host_atomic); if (!host) { host = mach_host_self(); + atomic_store(&host_atomic, host); } vm_statistics_data_t host_vm; @@ -357,7 +358,7 @@ static void UpdateHostMemory() { } size_t hostMemoryFree = host_vm.free_count * vm_kernel_page_size; - ATOMIC_SET(bsg_runContext->hostMemoryFree, hostMemoryFree); + bsg_runContext->hostMemoryFree = hostMemoryFree; } static void UpdateTaskMemory() { diff --git a/Bugsnag/Helpers/BSGSerialization.h b/Bugsnag/Helpers/BSGSerialization.h index 98dcf551d..9c37ba850 100644 --- a/Bugsnag/Helpers/BSGSerialization.h +++ b/Bugsnag/Helpers/BSGSerialization.h @@ -9,7 +9,9 @@ NS_ASSUME_NONNULL_BEGIN @param input a dictionary @return a new dictionary */ -NSMutableDictionary * BSGSanitizeDict(NSDictionary *input); +NSMutableDictionary *BSGSanitizeDict(NSDictionary * input); + +NSMutableDictionary *_Nullable BSGSanitizePossibleDict(NSDictionary *_Nullable input); /** Cleans the object, including nested dictionary and array values @@ -25,7 +27,8 @@ typedef struct _BSGTruncateContext { NSUInteger length; } BSGTruncateContext; -NSString * BSGTruncateString(BSGTruncateContext *context, NSString *_Nullable string); +NSString * BSGTruncateString(BSGTruncateContext *context, NSString * string); +NSString *_Nullable BSGTruncatePossibleString(BSGTruncateContext *context, NSString *_Nullable string); id BSGTruncateStrings(BSGTruncateContext *context, id object); diff --git a/Bugsnag/Helpers/BSGSerialization.m b/Bugsnag/Helpers/BSGSerialization.m index c4d3265fe..997b279e8 100644 --- a/Bugsnag/Helpers/BSGSerialization.m +++ b/Bugsnag/Helpers/BSGSerialization.m @@ -20,10 +20,14 @@ id BSGSanitizeObject(id obj) { return nil; } -NSMutableDictionary * BSGSanitizeDict(NSDictionary *input) { +NSMutableDictionary * BSGSanitizePossibleDict(NSDictionary *input) { if (![input isKindOfClass:[NSDictionary class]]) { return nil; } + return BSGSanitizeDict(input); +} + +NSMutableDictionary * BSGSanitizeDict(NSDictionary *input) { __block NSMutableDictionary *output = [NSMutableDictionary dictionaryWithCapacity:[input count]]; [input enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, @@ -47,10 +51,14 @@ id BSGSanitizeObject(id obj) { return output; } -NSString * BSGTruncateString(BSGTruncateContext *context, NSString *string) { +NSString * BSGTruncatePossibleString(BSGTruncateContext *context, NSString *string) { if (![string isKindOfClass:[NSString class]]) { return nil; } + return BSGTruncateString(context, string); +} + +NSString * BSGTruncateString(BSGTruncateContext *context, NSString *string) { const NSUInteger inputLength = string.length; if (inputLength <= context->maxLength) return string; // Prevent chopping in the middle of a composed character sequence diff --git a/Bugsnag/Payload/BugsnagEvent.m b/Bugsnag/Payload/BugsnagEvent.m index d995c22df..df6c19ee1 100644 --- a/Bugsnag/Payload/BugsnagEvent.m +++ b/Bugsnag/Payload/BugsnagEvent.m @@ -729,12 +729,12 @@ - (void)truncateStrings:(NSUInteger)maxLength { }; if (self.context) { - self.context = BSGTruncateString(&context, self.context); + self.context = BSGTruncatePossibleString(&context, self.context); } for (BugsnagError *error in self.errors) { - error.errorClass = BSGTruncateString(&context, error.errorClass); - error.errorMessage = BSGTruncateString(&context, error.errorMessage); + error.errorClass = BSGTruncatePossibleString(&context, error.errorClass); + error.errorMessage = BSGTruncatePossibleString(&context, error.errorMessage); } for (BugsnagBreadcrumb *breadcrumb in self.breadcrumbs) { diff --git a/Tests/BugsnagTests/BugsnagCollectionsTests.m b/Tests/BugsnagTests/BugsnagCollectionsTests.m index 7f5c802df..b376fb0cd 100644 --- a/Tests/BugsnagTests/BugsnagCollectionsTests.m +++ b/Tests/BugsnagTests/BugsnagCollectionsTests.m @@ -50,7 +50,10 @@ - (void)testDstEmpty { - (void)testDstNil { id src = @{@"a": @"one"}; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wnonnull" XCTAssertEqualObjects(src, BSGDictMerge(src, nil), @"should copy"); +#pragma clang diagnostic pop } - (void)testSrcDict { @@ -74,8 +77,11 @@ - (void)testSrcDstDict { // MARK: BSGJSONDictionary - (void)testBSGJSONDictionary { +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wnonnull" XCTAssertNil(BSGJSONDictionary(nil)); - +#pragma clang diagnostic pop + id validDictionary = @{ @"name": @"foobar", @"count": @1,