1. May 13, 2019
  2. May 12, 2019
    • Matthew Fernandez's avatar
      release v2019.05.11 · 49d810c6
      Matthew Fernandez authored
      49d810c6
    • Matthew Fernandez's avatar
      optimisation: don't require a jmp_buf when --max-errors < 2 · 603f1809
      Matthew Fernandez authored
      We were using the sigsetjmp()/siglongjmp() exception mechanism when either of
      two things were true:
      
        1. --max-errors > 1; or
        2. the model has assumptions.
      
      As of 7dda1203, a failed assumption is signalled
      via a normal return value, not via a siglongjmp(). As a result, we no longer
      need to require a jmp_buf in this case. This should result in a slight speed up
      for models that have assumptions but run with --max-errors < 2.
      
      Github: related to #127 "--max-errors > 1 produces unsafe code"
      603f1809
    • Matthew Fernandez's avatar
      fix: push setjmp calls into rules/guards/etc · 7dda1203
      Matthew Fernandez authored
      The motivation for this change is to fix an error in our usage of sigsetjmp().
      When using jmp_bufs (JMP_BUF_NEEDED), we use sigsetjmp() and siglongjmp() to
      give us an exception-handling-like mechanism to jump back to the exploration
      loop after signalling an error. This pattern is fine except that these calls are
      documented to leave all non-volatile locals in an indeterminate state. We had
      several of these that were important (e.g. the pointer to the state that we go
      on to free).
      
      My initial planned solution to this was to simply mark the relevant variables
      volatile. However, this comes with some drawbacks. Unconditionally marking these
      volatile impedes the compiler's optimiser in the case when we're not using
      jmp_bufs, while conditionally marking them volatile overcomplicates the code
      generation logic. To further complicate this, some of the relevant variables are
      generated (ruleset iterators). We would have to cast away these variables'
      volatility when passing them to rules which would introduce even further
      complications.
      
      Instead, we duplicate the sigsetjmp() calls and move them inwards. E.g. for
      guards, we call sigsetjmp() as the first step in the guard itself and then use
      the return value of the guard to indicate to the exploration loop whether
      siglongjmp() was called. The advantage of this is that the only work done in the
      siglongjmp() path is now returning from the containing function; there are no
      longer any relevant non-volatile locals.
      
      This had a couple of unanticipated side effects:
      
        1. The error call in case of a deadlock had to be moved into its own function
           to also avoid having any non-volatile locals. This is not a problem, just
           unexpected.
        2. Return statements now awkwardly return a boolean when they have no
           associated expression. Relatedly void-returning functions (procedures) now
           have a boolean return type. This is because a return statement can be used
           in a rule (which now returns a boolean). We could have done something more
           elaborate like have an empty return statement jump to the end of the
           rule/function, but it seemed this would be more likely to confuse the
           compiler.
      
      Github: closes #127 "--max-errors > 1 produces unsafe code"
      7dda1203
  3. May 10, 2019
  4. May 07, 2019
  5. May 06, 2019
  6. May 05, 2019
    • Matthew Fernandez's avatar
      enable now-passing test · 78bc3de0
      Matthew Fernandez authored
      Github: related to #125 "diff traces over share with arrays"
      78bc3de0
    • Matthew Fernandez's avatar
      fix: correct previous value read when determining deltas to print · 94ef1dec
      Matthew Fernandez authored
      When printing a diff counter-example trace (the default), some values that did
      not change were being re-printed. That is, sometimes there would be no delta in
      the value of a state component between one state and the next but its value
      would be printed anyway. The underlying problem was that the handle used to read
      from the previous state was incorrect. More specifically, this handle was always
      using a base value of the start of the state data rather than the byte in which
      the current field started.
      
      This bug was introduced in d783655e when state
      handles were changed to use a closer base. We missed that this left the
      calculation of the handle to the previous state in state_print incorrect.
      
      Github: closes #125 "diff traces over share with arrays"
      94ef1dec
    • Matthew Fernandez's avatar
      add a test case for diff trace bug · 659e47d7
      Matthew Fernandez authored
      Github: related to #125 "diff traces over share with arrays"
      659e47d7
    • Matthew Fernandez's avatar
      remove the concept of disabled properties · 4e30098a
      Matthew Fernandez authored
      These were included originally because the thinking was that we would eventually
      have command line options allowing the user to change the types of individual
      properties. In this scheme, one of the possibilities would be "disable this
      property." Now that all the planned property types are implemented (invariants,
      covers, and liveness) it's become clear that changing the type of a property
      after it's been written isn't something you generally want to do. Moreover, if
      you really do want to do this it's unlikely something you need to be tweakable
      from the command line; you can just go into the model source and edit the
      relevant property.
      
      Note that a side effect of this change is that 'property' is no longer a
      keyword.
      
      Github: closes #47 "properties, covers, etc"
      4e30098a
  7. May 03, 2019
  8. Apr 30, 2019
  9. Apr 29, 2019
  10. Apr 28, 2019