(language, compilation and debugging) david 09/16/2011

28
(language, compilation and debugging) David 09/16/2011

Upload: jasper-white

Post on 14-Jan-2016

221 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: (language, compilation and debugging) David 09/16/2011

(language, compilation and debugging)

David

09/16/2011

Page 2: (language, compilation and debugging) David 09/16/2011

Content

C language overview

Compilation

debugging

Page 3: (language, compilation and debugging) David 09/16/2011

Basic data type

Integer int, short, long, long long and unsigned

Char a byte has the same number of bits of char

_Bool Integer with 1 bit in memory

Floating point float, double, and long double

Page 4: (language, compilation and debugging) David 09/16/2011

Other data type

Pointer type *p; store the address of memory location

array type name[dim];

struct struct ex{

int a;char b;};

const int * const p; /*a const pointer to a int*/ const int * p; /*a pointer to a const int*/

Page 5: (language, compilation and debugging) David 09/16/2011

Statement

conditionals if switch-case

loops while (do-while)

while(1){} for

break/continue change the flow of execution

Page 6: (language, compilation and debugging) David 09/16/2011

Functions functions written by yourself

return-type function-name ( argument-list-if-necessary ){...local-declarations......statements...return return-value;}

library functions include header files in your code

libraries stdio.h string.h stdlib.h

Page 7: (language, compilation and debugging) David 09/16/2011

Example - 1

int max(int a, int b) {

if(a > b)

return a;

else

return b;

}

int factorial(int a) {

int ret = 1;

if(a < 0)

return -1;

while(a > 0)

ret *= a--;

return ret;

}

If and while statements

Page 8: (language, compilation and debugging) David 09/16/2011

Example - 2int even_sum (int m) {

int sum = 0;

while (m > 0) {

switch (m%2) {

case 1:

m--;

break;

case 0:

sum += m--;

}

}

return sum;

}

switch statement

Page 9: (language, compilation and debugging) David 09/16/2011

Example - 3

float thres_sum(float *array, int size, float thres){

int i;

float sum = 0;

for(i = 0; i < size; i++) {

if(array[i] <= thres)

continue;

else

sum += array[i];

}

return sum; }

for statement and pointer

Page 10: (language, compilation and debugging) David 09/16/2011

Example - 4

#define PI 3.1415926

typedef struct cylinder Cy;

Cy max_volumn (Cy cy1, Cy cy2) {

float vol1, vol2;

vol1 = PI * cy1.r * cy1.r * cy1.H;

vol2 = PI * cy2.r * cy2.r * cy2.H;

if(vol1 > vol2)

return cy1;

else

return cy2;

}

Struct and typedef

struct cylinder {

float r;

float H;

};

Page 11: (language, compilation and debugging) David 09/16/2011

Recursive function call

a function that contains a call to itself. Divide complex problem into identical

simple cases. Must have at least one exit condition that

can be satisfied. i.e. Towers of Hanoi

int factorial (int n) {

if(n == 1)

return 1;

else

return n * factorial(n-1);

}

Page 12: (language, compilation and debugging) David 09/16/2011

Pass by value vs. pass by address

How are parameters passed to a function? pass by value: make a copy of the variable

Simple Can not change the passed variable

pass by address: address of the variable is passed Efficient Can change the variable, though the address of the

variable is not changed

Page 13: (language, compilation and debugging) David 09/16/2011

void swap1(int a, int b) {

int c;

c = b;

b = a;

a = c;

}

void swap2(int *a, int *b) {

int c;

c = *b;

*b = *a;

*a = c;

}

Example - 5

Pass by value and pass by reference

Page 14: (language, compilation and debugging) David 09/16/2011

int main() {

int a = 3, b = 5;

swap1(a,b);

printf(“a is %d, b is %d\n”, a, b);

swap2(&a, &b);

printf(“a is %d, b is %d\n”, a, b);

return 0;

}

Example - 5 (continued)

Pass by value and pass by reference

Page 15: (language, compilation and debugging) David 09/16/2011

Dynamic memory allocation

Typical variable definition (known size) Statically defined in program Allocated in the stack i.e., int a[10]

Define a variable that has a varying size? Allocated at run-time, in the heap Use malloc() function call to allocate Use free(*pointer) to free the memory of a

variable

Page 16: (language, compilation and debugging) David 09/16/2011

int main() {

int *array, i, size;

printf(“Input the array size:”);

scanf(“%d”, &size);

array = (int *)malloc(size, sizeof(int));

for(i=0; i < size; i++)

array[i] = i;

free(array); //otherwise, memory leak

return 0; }

Example - 6

Dynamic memory allocation

Page 17: (language, compilation and debugging) David 09/16/2011

Preprocessing directives

#define Defines a macro. #include Inserts text from another source file. #ifdef Conditionally includes source text if a macro name

is defined. #ifndef Conditionally includes source text if a macro

name is not defined. #ifndef FILENAME_H

#define FILENAME_H…#endif

#else Conditionally includes source text if the previous #ifdef, #ifndef test fails.

#endif Ends conditional text.

Page 18: (language, compilation and debugging) David 09/16/2011

I/O capability

FILE *fp; fp = fopen(name, mode); fclose(fp); fprintf(fp, "format string", variable list); fgets(str_name, length, fp); feof(fp);

while(!feof(fp)) {fgets(line, max_length, fp);…

}

Page 19: (language, compilation and debugging) David 09/16/2011

Example - 7

int print_triangle(char style, int base, char *filename) {

int i,j;

FILE *fp = fopen(filename, “w+”); // open file

if(fp == NULL)

return -1;

if(lines % 2 == 0) base--;

for(i = 1; i <= base; i=i+2) {

for(j = 0; j < (base – 1) / 2; j++)

fprintf(fp, ‘ ‘);

for(j = 0; j < i; j++)

fprintf(fp, “%c”,style);

fprintf(fp, “\n”);

}

fclose(fp); return 0; }

****

************

**********

File operations

Page 20: (language, compilation and debugging) David 09/16/2011

Command-line arguments

main(int argc, char** argv) a.out -i 2 -g -x 3 argc = 6

argv[0] = "a.out"argv[1] = "-i"argv[2] = "2"argv[3] = "-g"argv[4] = "-x"argv[5] = "3"

Page 21: (language, compilation and debugging) David 09/16/2011

Compilation

gcc codename –o programname make prog = cc –o prog prog.c options

-o filename -g produce extra debugging information -O(0/1/2/3) optimization level -I(i)directory add header file directory -l(L)libraryname link the library

Page 22: (language, compilation and debugging) David 09/16/2011

Example - 8

#include <stdio.h>

#include <math.h>

int main() {

double s3 = sqrt(3);

printf(“Square root of 3 is:%lf\n”, s3);

return 0;

}

Library UsageSource code: example.c

Compilation gcc –g –o example example.c –lm

Page 23: (language, compilation and debugging) David 09/16/2011

Makefile

Multiple files compilation files

main.c factorial.c hello.c

Run make

#Makefile_example

all: hello

hello: main.o factorial.o hello.o

gcc main.o factorial.o hello.o -o hello

main.o: main.c

gcc -c main.c

factorial.o: factorial.c

gcc -c factorial.c

hello.o: hello.c

gcc -c hello.c

clean:

rm -rf *o hello

Page 24: (language, compilation and debugging) David 09/16/2011

Another makefile

CC=gcc CFLAGS=-c -Wall SOURCES=main.c hello.c factorial.cOBJECTS=$(SOURCES:.c=.o)EXECUTABLE=helloall: $(SOURCES) $(EXECUTABLE)$(EXECUTABLE): $(OBJECTS)

$(CC) $(OBJECTS) -o $@ .c.o:

$(CC) $(CFLAGS) $< -o $@

http://mrbook.org/tutorials/make/

Page 25: (language, compilation and debugging) David 09/16/2011

Common compilation errors

Typos (C language is case sensitive) Try to use a variable without definition Some statements are not ended by ; Brackets are not paired ( ), { }, [ ] Number or type of parameters passed to a

function does not match the function definition.

Still have errors? copy the error message, Google it.

Page 26: (language, compilation and debugging) David 09/16/2011

gdb for debugging

-g in compilation to enable gdb gdb obj //start gdb with obj program (gdb) run (arg <arguments>) (gdb) s for step execution (gdb) p for print variables (gdb) br to set breakpoint (gdb) set to modify registers or memory

set $eax=10 (gdb) help

Page 27: (language, compilation and debugging) David 09/16/2011

Most powerful debug tool

printf function print out check points near vulnerable

codes to trace down where bug appears i.e, File operation, control statements...

print out value of variables to trace down when bug happens

i.e. invalid array operation, loop does not stop, and etc.

Page 28: (language, compilation and debugging) David 09/16/2011

For more information

http://www.ic.sunysb.edu/Stu/xdeng/c.htm Email: [email protected] Google