CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
66 lines
2.7 KiB
C
66 lines
2.7 KiB
C
// RUN: %clang_analyze_cc1 -fblocks -analyzer-checker=core,nullability,debug.ExprInspection -verify %s
|
|
|
|
void clang_analyzer_warnIfReached(void);
|
|
|
|
void it_takes_two(int a, int b);
|
|
void function_pointer_arity_mismatch(void) {
|
|
void(*fptr)() = it_takes_two;
|
|
fptr(1); // no-crash expected-warning {{Function taking 2 arguments is called with fewer (1)}}
|
|
// expected-warning@-1 {{passing arguments to a function without a prototype is deprecated in all versions of C and is not supported in C23}}
|
|
}
|
|
|
|
void block_arity_mismatch(void) {
|
|
void(^b)() = ^(int a, int b) { };
|
|
b(1); // no-crash expected-warning {{Block taking 2 arguments is called with fewer (1)}}
|
|
// expected-warning@-1 {{passing arguments to a function without a prototype is deprecated in all versions of C and is not supported in C23}}
|
|
}
|
|
|
|
int *nonnull_return_annotation_indirect(void) __attribute__((returns_nonnull));
|
|
int *nonnull_return_annotation_indirect(void) {
|
|
int *x = 0;
|
|
return x; // expected-warning {{Null returned from a function that is expected to return a non-null value}}
|
|
}
|
|
|
|
int *nonnull_return_annotation_direct(void) __attribute__((returns_nonnull));
|
|
int *nonnull_return_annotation_direct(void) {
|
|
return 0; // expected-warning {{Null returned from a function that is expected to return a non-null value}}
|
|
} // expected-warning@-1 {{null returned from function that requires a non-null return value}}
|
|
|
|
int *nonnull_return_annotation_assumed(int* ptr) __attribute__((returns_nonnull));
|
|
int *nonnull_return_annotation_assumed(int* ptr) {
|
|
if (ptr) {
|
|
return ptr;
|
|
}
|
|
return ptr; // expected-warning {{Null returned from a function that is expected to return a non-null value}}
|
|
}
|
|
|
|
int *produce_nonnull_ptr(void) __attribute__((returns_nonnull));
|
|
|
|
__attribute__((returns_nonnull))
|
|
int *cannot_return_null(void) {
|
|
int *x = produce_nonnull_ptr();
|
|
if (!x) {
|
|
clang_analyzer_warnIfReached();
|
|
// expected-warning@-1 {{REACHABLE}}
|
|
// TODO: This warning is a false positive, according to the contract of
|
|
// produce_nonnull_ptr, x cannot be null.
|
|
}
|
|
// Regardless of the potential state split above, x cannot be nullptr
|
|
// according to the produce_nonnull_ptr annotation.
|
|
return x;
|
|
// False positive: expected-warning@-1 {{Null returned from a function that is expected to return a non-null value}}
|
|
}
|
|
|
|
__attribute__((returns_nonnull)) int *passthrough(int *p) {
|
|
return p; // no-warning: we have no evidence that `p` is null, i.e., violating the contract
|
|
}
|
|
|
|
__attribute__((returns_nonnull)) int *passthrough2(int *p);
|
|
int *passthrough2(int *p) {
|
|
return p; // expected-warning{{Null returned from a function that is expected to return a non-null value}}
|
|
}
|
|
|
|
void call_with_null(void) {
|
|
passthrough2(0);
|
|
}
|