Skip to content

Keep side-effect-less expression statements when wanted #145

@sim642

Description

@sim642

This is an even simpler version of #140.

CIL removes side-effect-less standalone expressions completely, but this makes Goblint unsound as it misses a race. For example in

#include <pthread.h>
#include <stdio.h>

int myglobal;
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t mutex2 = PTHREAD_MUTEX_INITIALIZER;

void *t_fun(void *arg) {
  pthread_mutex_lock(&mutex1);
  myglobal; // RACE!
  pthread_mutex_unlock(&mutex1);
  return NULL;
}

int main(void) {
  pthread_t id;
  pthread_create(&id, NULL, t_fun, NULL);
  pthread_mutex_lock(&mutex2);
  myglobal=myglobal+1; // RACE!
  pthread_mutex_unlock(&mutex2);
  pthread_join (id, NULL);
  return 0;
}

Obviously any sensible compiler just optimizes away, but I don't think the standard demands such optimization. It just says the expression is evaluated:

The expression in an expression statement is evaluated as a void expression for its side effects.

The semantic descriptions in this International Standard describe the behavior of an abstract machine in which issues of optimization are irrelevant.

I think the problem is that the CIL AST has no construct that corresponds to this. It's only Cabs which as A.COMPUTATION.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions