CSE306 Software Quality in Practice Dr. Carl Alphonce - - PowerPoint PPT Presentation

cse306 software quality in practice
SMART_READER_LITE
LIVE PREVIEW

CSE306 Software Quality in Practice Dr. Carl Alphonce - - PowerPoint PPT Presentation

CSE306 Software Quality in Practice Dr. Carl Alphonce alphonce@buffalo.edu 343 Davis Hall Announcements Syllabus: posted on website Academic Integrity PRE posted on website Team formation - how's it going? Grades will be in UBLearns


slide-1
SLIDE 1

CSE306 Software Quality in Practice

  • Dr. Carl Alphonce

alphonce@buffalo.edu 343 Davis Hall

slide-2
SLIDE 2

Announcements

Syllabus: posted on website Academic Integrity PRE posted on website Team formation - how's it going? Grades will be in UBLearns

slide-3
SLIDE 3

Compiler

use /util/bin/gcc compiler use -std=c11 (you can use other options too) test on timberlake.cse.buffalo.edu (that’ s our reference system) If you modify your .cshrc file you can access the CSE installation of the compiler directly from the Bell 340 machines. (We'll do this soon as part of a LEX…but one step at a time!)

slide-4
SLIDE 4

text, pg 8

slide-5
SLIDE 5
  • 1. Understand the

requirements

Is it a bug or a misunderstanding

  • f expected behavior?

Requirements will tell you.

slide-6
SLIDE 6
  • 2. Make it fail

Write test cases to isolate bug and make it reproducible. This will increase confidence that bug is fixed later. These tests will be added to the suite

  • f regression tests (“does today’

s code pass yesterday’ s tests?”)

slide-7
SLIDE 7
  • 3. Simplify the test

case

Ensure there is nothing extraneous in the test case. Keep it simple! Whittle it down until you get at the essence of the failure.

slide-8
SLIDE 8
  • 4. Read the right

error message

“Everything that happened after the first thing went wrong should be eyed with suspicion. The first problem may have left the program in a corrupt state. ” [p. 9]

slide-9
SLIDE 9

CONTINUING ON FROM LAST TIME

slide-10
SLIDE 10
  • 5. Check the plug
slide-11
SLIDE 11
  • 5. Check the plug

Don’ t overlook the obvious - things like permissions, file system status, available memory. “Think of ten common mistakes, and ensure nobody made them. ” [p. 9]

slide-12
SLIDE 12
  • 6. Separate fact

from fiction

slide-13
SLIDE 13
  • 6. Separate fact

from fiction

“Don’ t assume!” Can you prove what you believe to be true?

slide-14
SLIDE 14
  • 7. Divide and

conquer

slide-15
SLIDE 15
  • 7. Divide and

conquer

Beware bugs caused by interactions amongst components. Develop a list of suspects (source code, compiler, environment, libraries, machine, etc) Each component alone may work correctly, but in combination bad things happen Can be especially tricky with multithreaded programs

slide-16
SLIDE 16
  • 8. Match the tool

to the bug

slide-17
SLIDE 17
  • 8. Match the tool

to the bug

If all you have is a hammer … you’ll end up with a very sore thumb. Build a solid toolkit to give you choices. Use multiple tools/approaches (e.g. testing and debugging work better together than either along)

slide-18
SLIDE 18
  • 9. One change at a

time

slide-19
SLIDE 19
  • 9. One change at a

time

Be methodical. If you make multiple changes at one you can't tease apart which change had which effect. With your list of suspects, document what you predict the outcome of a change will be. Document the changes you make, and the results. Did results match predictions?

slide-20
SLIDE 20
  • 10. Keep an audit

trail

slide-21
SLIDE 21
  • 10. Keep an audit

trail

Make sure you can revert your code: use a code repository! This lets you back out changes that were not productive.

slide-22
SLIDE 22
  • 11. Get a fresh

view

slide-23
SLIDE 23
  • 11. Get a fresh

view

Ask for someone else to have a look — but not before having done steps 1 - 10! Even just explaining the situation can help you better understand what is happening.

slide-24
SLIDE 24
  • 12. If you didn’

t fix it, it ain’ t fixed

slide-25
SLIDE 25
  • 12. If you didn’

t fix it, it ain’ t fixed

Intermittent bugs will recur. If you make a change to the code and the symptom goes away, did you really fix it? You must convince yourself that the fix you applied really did solve the problem!

slide-26
SLIDE 26
  • 13. Cover your bug fix

with a regression test

slide-27
SLIDE 27
  • 13. Cover your bug fix

with a regression test

Make sure the bug doesn’ t come back! Just because it worked yesterday doesn't mean it still works today. This is especially important in team environments where you are not the only person touching the code.

slide-28
SLIDE 28

Essential tools

compiler (e.g gcc) debugger (e.g. gbd) memory checker (e.g. memcheck) runtime profiler (e.g. gprof) automated testing framework (e.g. cunit) build tool (e.g. make, gradle) code repository (e.g. git)

  • rganization/collaboration tool (e.g. ZenHub, Trello)

pad of paper / whiteboard

slide-29
SLIDE 29

Classification of bugs

Common bug (source code, predictable) Sporadic bug (intermittent) Heisenbugs (averse to observation) race conditions memory access violations (programmer) optimizations Multiple bugs - several must be fixed before program behavior changes - consider violating rule #9 "one change at a time"

slide-30
SLIDE 30

uncertainty principle

…the uncertainty principle, also known as Heisenberg's uncertainty principle, is any of a variety of mathematical inequalities[1] asserting a fundamental limit to the precision with which certain pairs of physical properties of a particle, known as complementary variables, such as position x and momentum p, can be known.

https:/ / en.wikipedia.org/wiki/Uncertainty_principle

slide-31
SLIDE 31
  • bserver effect

…the term observer effect refers to changes that the act of observation will make on a phenomenon being observed. This is often the result of instruments that, by necessity, alter the state of what they measure in some manner.

https:/ / en.wikipedia.org/wiki/Observer_effect_(physics)

slide-32
SLIDE 32

debugging tools

instrument code during compilation instrumented code may behave differently than uninstrumented code in other words: the act of using a debugger may mask a bug, causing its symptoms to disappear, only to reappear when run without instrumentation

slide-33
SLIDE 33

Essential tools

compiler (e.g gcc) debugger (e.g. gbd) memory checker (e.g. memcheck) runtime profiler (e.g. gprof) automated testing framework (e.g. cunit) build tool (e.g. make, gradle) code repository (e.g. git)

slide-34
SLIDE 34

Memory organization

STATIC DYNAMIC

Each process (a running program) has a chunk of memory at its disposal. This memory is divided into "static" memory (allocated/ structured before execution begins) and "dynamic" memory (allocated while the program executes.

slide-35
SLIDE 35

Memory organization

STATIC DYNAMIC TEXT: program DATA

The static segment is divided into a TEXT segment (holding the machine language instructions of the program), and a DATA segment (which has space for statically allocated memory, constants, literal values, etc).

slide-36
SLIDE 36

Memory organization

STATIC DYNAMIC TEXT: program DATA HEAP

The dynamic segment is divided into STACK and a HEAP areas. The HEAP is generally located adjacent to the STATIC segment, and grows "down" (to higher memory addresses).

slide-37
SLIDE 37

Memory organization

STATIC DYNAMIC TEXT: program DATA HEAP free memory STACK

The STACK is generally located at the far end of memory and grows "up" (to lower memory addresses). The area between the HEAP and the STACK represents available (free) memory. It the HEAP and STACK collide we have an out-of- memory error.

slide-38
SLIDE 38

Memory organization

STATIC DYNAMIC TEXT: program DATA HEAP free memory STACK

The STACK holds invocation records (also called stack frames). An invocation record is created whenever a function is called. It has space for the function's parameters, local variables, any return value, as well as bookkeeping information related to the call itself (e.g. where to return to).

slide-39
SLIDE 39

Memory organization

STATIC DYNAMIC TEXT: program DATA HEAP free memory main

Consider this code: void g() { … } void f() { … g(); … } int main() { … f() … } The invocation record for main is pushed on the stack as soon as execution begins. main's record is the current/ active one.

slide-40
SLIDE 40

Memory organization

STATIC DYNAMIC TEXT: program DATA HEAP free memory main f

Consider this code: void g() { … } void f() { … g(); … } int main() { … f() … } When f() is called, an invocation record for f is pushed to the top of the stack. f's record is the current/ active one.

slide-41
SLIDE 41

Memory organization

STATIC DYNAMIC TEXT: program DATA HEAP free memory STACK main f g

Consider this code: void g() { … } void f() { … g(); … } int main() { … f() … } When g() is called, an invocation record for g is pushed to the top of the stack. g's record is the current/ active one.

slide-42
SLIDE 42

Memory organization

STATIC DYNAMIC TEXT: program DATA HEAP free memory main f

Consider this code: void g() { … } void f() { … g(); … } int main() { … f() … } When g() returns its invocation record is removed from the stack, an f's invocation record becomes the current/active

  • ne.
slide-43
SLIDE 43

Memory organization

STATIC DYNAMIC TEXT: program DATA HEAP free memory main

Consider this code: void g() { … } void f() { … g(); … } int main() { … f() … } When f() returns its invocation record is removed from the stack, an main's invocation record becomes the current/active

  • ne.