Skip to content
This repository has been archived by the owner on Nov 1, 2021. It is now read-only.

Commit

Permalink
Fix bugs listed by clang's static analyzer
Browse files Browse the repository at this point in the history
A few pedantic changes and unused variables (1-4), and genuine bugs (5,
6).

The reports with the corresponding files and lines numbers are as
follows.

1. backend/libinput/tablet_pad.c@31,44,57
"Allocator sizeof operand mismatch"
"Result of 'calloc' is converted to a pointer of type 'unsigned int',
which is incompatible with sizeof operand type 'int'"

2. types/tablet_v2/wlr_tablet_v2_pad.c@371
"Allocator sizeof operand mismatch"
"Result of 'calloc' is converted to a pointer of type 'uint32_t', which
is incompatible with sizeof operand type 'int'"

3. types/wlr_cursor.c@335
"Dead initialization"
"Value stored to 'dx'/'dy' during its initialization is never read"

4. rootston/xdg_shell.c@510
"Dead initialization"
"Value stored to 'desktop' during its initialization is never read"

5. types/tablet_v2/wlr_tablet_v2_pad.c@475
"Dereference of null pointer"
"Access to field 'strips' results in a dereference of a null pointer
(loaded from field 'current_client')"

The boolean logic was incorrect (c.f. the check in the following
function).

6. examples/idle.c@163,174,182
"Uninitialized argument value"
"1st function call argument is an uninitialized value"

If close_timeout != 0, but simulate_activity_timeout >= close_timeout,
the program would segfault at pthread_cancel(t1).
  • Loading branch information
arandomhuman authored and emersion committed Aug 31, 2018
1 parent 2f48453 commit 8589ae1
Show file tree
Hide file tree
Showing 5 changed files with 22 additions and 17 deletions.
6 changes: 3 additions & 3 deletions backend/libinput/tablet_pad.c
Expand Up @@ -28,7 +28,7 @@ static void add_pad_group_from_libinput(struct wlr_tablet_pad *pad,
++group->ring_count;
}
}
group->rings = calloc(sizeof(int), group->ring_count);
group->rings = calloc(sizeof(unsigned int), group->ring_count);
size_t ring = 0;
for (size_t i = 0; i < pad->ring_count; ++i) {
if (libinput_tablet_pad_mode_group_has_ring(li_group, i)) {
Expand All @@ -41,7 +41,7 @@ static void add_pad_group_from_libinput(struct wlr_tablet_pad *pad,
++group->strip_count;
}
}
group->strips = calloc(sizeof(int), group->strip_count);
group->strips = calloc(sizeof(unsigned int), group->strip_count);
size_t strip = 0;
for (size_t i = 0; i < pad->strip_count; ++i) {
if (libinput_tablet_pad_mode_group_has_strip(li_group, i)) {
Expand All @@ -54,7 +54,7 @@ static void add_pad_group_from_libinput(struct wlr_tablet_pad *pad,
++group->button_count;
}
}
group->buttons = calloc(sizeof(int), group->button_count);
group->buttons = calloc(sizeof(unsigned int), group->button_count);
size_t button = 0;
for (size_t i = 0; i < pad->button_count; ++i) {
if (libinput_tablet_pad_mode_group_has_button(li_group, i)) {
Expand Down
21 changes: 14 additions & 7 deletions examples/idle.c
Expand Up @@ -152,14 +152,20 @@ int main(int argc, char *argv[]) {
.display = display,
};

if (simulate_activity_timeout != 0 && simulate_activity_timeout < close_timeout) {
bool create_t1 = (simulate_activity_timeout != 0) &&
(simulate_activity_timeout < close_timeout);

if (create_t1) {
if (pthread_create(&t1, NULL, &simulate_activity, (void *)&arg) != 0) {
return -1;
}
}
if (close_timeout != 0) {

bool create_t2 = (close_timeout != 0);

if (create_t2) {
if (pthread_create(&t2, NULL, &close_program, (void *)&arg) != 0) {
if (simulate_activity_timeout != 0) {
if (create_t1) {
pthread_cancel(t1);
}
return -1;
Expand All @@ -170,18 +176,19 @@ int main(int argc, char *argv[]) {
fprintf(stdout, "waiting\n");

if (pthread_create(&t3, NULL, &main_loop, (void *)display) != 0) {
if (simulate_activity_timeout != 0) {
if (create_t1) {
pthread_cancel(t1);
}
if (close_timeout != 0 ) {
if (create_t2) {
pthread_cancel(t2);
}
return -1;
}

if (simulate_activity_timeout != 0) {
if (create_t1) {
pthread_join(t1, NULL);
}
if (close_timeout != 0) {
if (create_t2) {
pthread_join(t2, NULL);
}
pthread_cancel(t3);
Expand Down
2 changes: 0 additions & 2 deletions rootston/xdg_shell.c
Expand Up @@ -507,8 +507,6 @@ static void decoration_handle_surface_commit(struct wl_listener *listener,
}

void handle_xdg_toplevel_decoration(struct wl_listener *listener, void *data) {
struct roots_desktop *desktop =
wl_container_of(listener, desktop, xdg_toplevel_decoration);
struct wlr_xdg_toplevel_decoration_v1 *wlr_decoration = data;

wlr_log(WLR_DEBUG, "new xdg toplevel decoration");
Expand Down
8 changes: 4 additions & 4 deletions types/tablet_v2/wlr_tablet_v2_pad.c
Expand Up @@ -368,7 +368,7 @@ struct wlr_tablet_v2_tablet_pad *wlr_tablet_pad_create(
}

pad->group_count = wl_list_length(&wlr_pad->groups);
pad->groups = calloc(pad->group_count, sizeof(int));
pad->groups = calloc(pad->group_count, sizeof(uint32_t));
if (!pad->groups) {
free(pad);
return NULL;
Expand Down Expand Up @@ -471,9 +471,9 @@ void wlr_send_tablet_v2_tablet_pad_button(

void wlr_send_tablet_v2_tablet_pad_strip(struct wlr_tablet_v2_tablet_pad *pad,
uint32_t strip, double position, bool finger, uint32_t time) {
if (!pad->current_client &&
pad->current_client->strips &&
pad->current_client->strips[strip]) {
if (!pad->current_client ||
!pad->current_client->strips ||
!pad->current_client->strips[strip]) {
return;
}
struct wl_resource *resource = pad->current_client->strips[strip];
Expand Down
2 changes: 1 addition & 1 deletion types/wlr_cursor.c
Expand Up @@ -332,7 +332,7 @@ static void handle_pointer_motion(struct wl_listener *listener, void *data) {

static void apply_output_transform(double *x, double *y,
enum wl_output_transform transform) {
double dx = *x, dy = *y;
double dx, dy;
double width = 1.0, height = 1.0;

switch (transform) {
Expand Down

0 comments on commit 8589ae1

Please sign in to comment.