wykrywanie SIGSEGV

0

mam taki kod a właściwie fragment kodu ale odpowiednio przystosowany. Nie wiem w jaki sposób zapobiegać błędowi SIGSEGV z tymi danymi.
funkcja powinna zwrócić wartość 2 ponieważ wynik nie mieści się w zadeklarowanym "size"


#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int add(const char* number1, const char* number2, char* result, int size);
int add(const char* number1, const char* number2, char* result, int size)
{

    if(number1 == NULL || number2 == NULL || result == NULL || size<=0)
        return 1;
    int a = strlen(number1)-1;
    int b = strlen(number2)-1;
    int prz = 0,w1=0,w2=0;
    unsigned int sizee = size;

    for(int i=0;i<=size;i++) *(result+i)='\0';

    if (a>=b){
        while(a>=0)
        {
            w1 = *(number1+a)-'0';
            if (b>=0)
                w2 = *(number2+b)-'0';
            else
                w2=0;

            if (w1+w2+prz>9)
            {
                *(result+a+1) = (w1+w2+prz)%10+'0';
                prz = 1;
            }
            else
            {
                *(result+a+1) = (w1+w2+prz)+'0';
                prz = 0;
            }


            a--;
            b--;
        }
    }
    if (a<b){
        while(b>=0)
        {
            if (a>=0)
                w1 = *(number1+a)-'0';
            else
                w1=0;
            w2 = *(number2+b)-'0';

            if (w1+w2+prz>9)
            {
                *(result+b+1) = (w1+w2+prz)%10+'0';
                prz = 1;
            }
            else
            {
                *(result+b+1) = w1+w2+prz+'0';
                prz = 0;
            }


            a--;
            b--;
        }
    }

    if(prz) *(result)='1';
    else for(int i=0;i<size;i++) {
        *(result+i)=*(result+i+1);
        if (i==size) *(result+i+1)= '\0';
    }

    if (strlen(result) >= sizee)
        return 2;
    return 0;
}


int main() {
    int spr=0,size=200; char sum[201];
    spr = add("9246238036212195994147656550051558261814178909364557192441010878916335342536135882547377621891234119936473770424998186573871010376714553046181096967945753207546448113565268234170406826208065047902489740166236741584046425572667068007147627334290436645339404093287295977574321509957907494152292902340292995622645420253237032103292373272984601791828493208018233104565037376175420570637132869902259692318055969226591758570994363241786396313102017337742541804283001262859078228621458645756434199004920886767247289879966204260340428476492126314674105080299109117066462346235646152596987975957427176575548352746586974618062839020682689822802361273075286032525629112153039648079520890145825837026857948641692752530566048095815628462045028754685433605735961898648877681105085118055455266905401040132272736244011929152059200812481230710333912308346969329173572873924514363720436907952665139319309905302929394021754769514840333786661001515217748485283708799067705162884637269639931057928617376714772738610671444672224882046729663275430526113489995705308250761691379384584958044239057123320341191330179071518810233466034365521444231053686007520324973776715857071668969195915005792354479800594664991489290661568482333359700155796867692258116122996856013131603987377695878170418848639497378059243434647131864380617572302539830425637535310339424791110612858431211017369083291017041256461828550616683072690209229979475517634338562955153534678158154756188117803987495888133465701653680440995147332125890450675796044665315288027390781556880867448719263924509728157446051863973213538586252754408463194578013673595175642330932718534638475932255745205962942503344464178697498430586242768890559332251126872452330575565367569222396143300766474702608832626914878311166633496488140715521717357631499172652383683254597787155735287128617969915219669245986164003878685880673008508439484995805398426029780053314360074906576847010793290820743037558029182819142585325178238812523502522946972703712207352562991818370523932165233150658554592452473084793330401472992388206545172866606677474276508272702514765324366150313970230111869410465661745816056107122843826142081033099427725115073487429259759384428799673200796702164331878783777950013079616331846356511288578706264867544379705163414351077142233383381123440179083810792183227571588498115248007755385224046330330394440251400161966102669248351674740865908227966572884994371585939930101524443347015650068280143283419054696947666857719767553642903921207404647046339007493904711792982208529311476886116447750291830127219230265052080277390149122078407801772641742673100559178496847020447897762347160411350115631697602210886382499262706247394478378325560657356839714964326416269623850494789876149438473490518912364631459695666547958685549686567708827414541742640934197796389373048078748029845918718652701414996620743206352443488633922198782187052607936223202717844214416818245267013247474207262907086072107252738873248307076358908095612089281355346521536571871634697384381785442667029794156522254861422760611504512971905811412049399982212083923268126271699949641875326005234121032191876753884688662920681529693024574145068959074949147010012472215554057029244956893503578352070185920890479662321706766972915775980699373344028782417444139189893367316166603112814114373183098642099527379875901557850046059929448637126369431501078971283427259512904855017499389805108443743055809256001869234271127386868777683554745523272025931871115030795463703181307506271127080853367249403837211143473637738123339563882042066571231109830933382180772461899279147751532158528900864088546690079220193519941833810468020293546504276858379807741910497441914756612519994091975802839222412693910181710246110480738603383403690856137505060679759413196133595090562803868045814485708840342192483943667852545751775228088764980574929049217086623534619083",
    "191638633357063645573452582753583505185754428795847149284224076208227168112128839209056871963358409966484646270697282306290080156984938453692079017069429640614185196376224845062637525074253111102991931868887106271720653355672825494150175510852508877478866473690100394351458424950973128373782105424324585588386502982960706514979408524403025243352642352656282749639465880792488253472029651721576806126323644997043483030432025744034259832408592126892867996362861474326278825429805883024604815267888008283805222533075512894494584207340472536669817234950239906680592324343772369712093431623323210080746139993864326517306782749738633310414024456508116536108720543756913682072257142580179508905811369254246670970933678695048097014133726500686834026665342447351215395534290575024941188324979871644892237703725105499650320995687148818634567277481898441918917343652456719248227463739845764692629644650181508787394837000077709606024643220405997685544041923247363558396195542396790520479642655833450121321855635529299169866090602668915571290468499914242301802522182201039924451486226686518108972944421730531613138298994666517714107297623026926934679065091126858783644971241060399358272132314002490039536676851428680801201590193198372914170872549631268830309351367121340327594926947545030305923297577000236201478745589000522341040383286444764665256352699898242085854556944257454793007091040864681407111860738981333755527545525644779736470622514769344124376823626257922729704645922081731295626619560425205589776610341661563144684590183688439595516220014429043513512680967795161345487755102175694773234471904578573924471770438217883991730335384872717745604121049799535776229708894620913830356977955505826696518082187504023419432087934864822034007379811910828864381223443197322936664196881986780063554728203362182389702498823919898945655073005052176659732492366553578821810250825960412556485882477601728429502795623326441241610301603258396070593333223206334201068470047479858346360156102433063267132225760717745726720297312385459494389094303465399341630013948788448139183096576356386062281677579190525161888758555116689689627761495967202016779687323480361470645036024902112764892117825390910041099952796858880876943776144845365184230878970120645390834108984041323311258542418223272218723638647953327781990997494721823534442787747974313832114279676858894992011952523078090063709625677392284395698169497776516969687164570428514363722616266194728684134575741414685974247586780822788335977241260800750826514471134451274756611288566751725060156956754877027609437486786039443982255765620995610260925280564918710567444840525993923560585838263979951808890520254999250586205254533447610523207425415002618266416210003545417513674867952328344857974907296157523181304986334330113377370448256061783329326310272456171791202907750546780354192915150650636597988487364983225137894231591342602196477513705818725701370766186744917287420566125457739373768145148160341205745149890783220811547791339284035425881476913026790614140059113852590126869082195713022583655919373134498970975546494471423600506169841182023626373827629214713178407005472919362862167465245207084614605199508240096250595892087999821118986324952965060808884409978568203456556547352017862299312870248979748986856675430445885381638410366702547989734955575717798744592140655200478761729276401590519296133108483604461565126792430916553112367413483338666463124324146519453234103357147827461145218735987153990910989878225382740068917847164298693123820542860380688814763457934859429548237479327249444911900590634458857471154427638376995161755757593249098575765389835063448308849217912115423234420905599285621732455838178655608797521926403140199774680914850068663107379448210241934077183490522320513",
    &sum[0],size);
    if (spr != 0){
        printf("Incorrect input");
        return 1;
    }
    else{
    puts(sum);}


    return 0;
}



0

Debugger krzyczy że grzebiesz poza pamięcią w tym miejscu:

 *(result+a+1) = (w1+w2+prz)+'0';

Pozbywaj się duplikacji kodu. Np.:

const char* longer;
const char* shorter;
if (a >= b) {
    longer = number1;
    shorter = number2;
}
else {
    longer = number2;
    shorter = number1;
}
0

niestety nic to nie zmienia dalej ten sam błąd

1

result+a+1 wychodzi poza zadeklarowany obszar w jakim możesz się poruszać (a+1 jest większe niż size).

0

Twój komentarz nie do końca jest poprawny ale zauważyłeś coś bardzo słusznego, porównuje rozmiar z sumą ale przecież gdy któryś ze składników sumy będzie większy od size to wiadomo że suma też i dlatego nie potrzeba wykonywać całej funkcji. Niepotrzebnie patrzyłem przez pryzmat całego programu dla jednej funkcji.
Tak czy siak dziękuje za pomoc ;P

1 użytkowników online, w tym zalogowanych: 0, gości: 1