12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644664566466647664866496650665166526653665466556656665766586659666066616662666366646665666666676668666966706671667266736674667566766677667866796680668166826683668466856686668766886689669066916692669366946695669666976698669967006701670267036704670567066707670867096710671167126713671467156716671767186719672067216722672367246725672667276728672967306731673267336734673567366737673867396740674167426743674467456746674767486749675067516752675367546755675667576758675967606761676267636764676567666767676867696770677167726773677467756776677767786779678067816782678367846785678667876788678967906791679267936794679567966797679867996800680168026803680468056806680768086809681068116812681368146815681668176818681968206821682268236824682568266827682868296830683168326833683468356836683768386839684068416842684368446845684668476848684968506851685268536854685568566857685868596860686168626863686468656866686768686869687068716872687368746875687668776878687968806881688268836884688568866887688868896890689168926893689468956896689768986899690069016902690369046905690669076908690969106911691269136914691569166917691869196920692169226923692469256926692769286929693069316932693369346935 |
- use strict;
- use warnings;
- use POSIX;
- use File::Basename;
- use Cwd 'abs_path';
- use Term::ANSIColor qw(:constants);
- use Encode qw(decode encode);
- my $P = $0;
- my $D = dirname(abs_path($P));
- my $V = '0.32';
- use Getopt::Long qw(:config no_auto_abbrev);
- my $quiet = 0;
- my $tree = 1;
- my $chk_signoff = 1;
- my $chk_patch = 1;
- my $tst_only;
- my $emacs = 0;
- my $terse = 0;
- my $showfile = 0;
- my $file = 0;
- my $git = 0;
- my %git_commits = ();
- my $check = 0;
- my $check_orig = 0;
- my $summary = 1;
- my $mailback = 0;
- my $summary_file = 0;
- my $show_types = 0;
- my $list_types = 0;
- my $fix = 0;
- my $fix_inplace = 0;
- my $root;
- my %debug;
- my %camelcase = ();
- my %use_type = ();
- my @use = ();
- my %ignore_type = ();
- my @ignore = ();
- my @exclude = ();
- my $help = 0;
- my $configuration_file = ".checkpatch.conf";
- my $max_line_length = 80;
- my $ignore_perl_version = 0;
- my $minimum_perl_version = 5.10.0;
- my $min_conf_desc_length = 4;
- my $spelling_file = "$D/spelling.txt";
- my $codespell = 0;
- my $codespellfile = "/usr/share/codespell/dictionary.txt";
- my $conststructsfile = "$D/const_structs.checkpatch";
- my $typedefsfile;
- my $color = "auto";
- my $allow_c99_comments = 0;
- my $git_command ='export LANGUAGE=en_US.UTF-8; git';
- my $tabsize = 8;
- sub help {
- my ($exitcode) = @_;
- print << "EOM";
- Usage: $P [OPTION]... [FILE]...
- Version: $V
- Options:
- -q, --quiet quiet
- --no-tree run without a kernel tree
- --no-signoff do not check for 'Signed-off-by' line
- --patch treat FILE as patchfile (default)
- --emacs emacs compile window format
- --terse one line per report
- --showfile emit diffed file position, not input file position
- -g, --git treat FILE as a single commit or git revision range
- single git commit with:
- <rev>
- <rev>^
- <rev>~n
- multiple git commits with:
- <rev1>..<rev2>
- <rev1>...<rev2>
- <rev>-<count>
- git merges are ignored
- -f, --file treat FILE as regular source file
- --subjective, --strict enable more subjective tests
- --list-types list the possible message types
- --types TYPE(,TYPE2...) show only these comma separated message types
- --ignore TYPE(,TYPE2...) ignore various comma separated message types
- --exclude DIR(,DIR22...) exclude directories
- --show-types show the specific message type in the output
- --max-line-length=n set the maximum line length, (default $max_line_length)
- if exceeded, warn on patches
- requires --strict for use with --file
- --min-conf-desc-length=n set the min description length, if shorter, warn
- --tab-size=n set the number of spaces for tab (default $tabsize)
- --root=PATH PATH to the kernel tree root
- --no-summary suppress the per-file summary
- --mailback only produce a report in case of warnings/errors
- --summary-file include the filename in summary
- --debug KEY=[0|1] turn on/off debugging of KEY, where KEY is one of
- 'values', 'possible', 'type', and 'attr' (default
- is all off)
- --test-only=WORD report only warnings/errors containing WORD
- literally
- --fix EXPERIMENTAL - may create horrible results
- If correctable single-line errors exist, create
- "<inputfile>.EXPERIMENTAL-checkpatch-fixes"
- with potential errors corrected to the preferred
- checkpatch style
- --fix-inplace EXPERIMENTAL - may create horrible results
- Is the same as --fix, but overwrites the input
- file. It's your fault if there's no backup or git
- --ignore-perl-version override checking of perl version. expect
- runtime errors.
- --codespell Use the codespell dictionary for spelling/typos
- (default:/usr/share/codespell/dictionary.txt)
- --codespellfile Use this codespell dictionary
- --typedefsfile Read additional types from this file
- --color[=WHEN] Use colors 'always', 'never', or only when output
- is a terminal ('auto'). Default is 'auto'.
- -h, --help, --version display this help and exit
- When FILE is - read standard input.
- EOM
- exit($exitcode);
- }
- sub uniq {
- my %seen;
- return grep { !$seen{$_}++ } @_;
- }
- sub list_types {
- my ($exitcode) = @_;
- my $count = 0;
- local $/ = undef;
- open(my $script, '<', abs_path($P)) or
- die "$P: Can't read '$P' $!\n";
- my $text = <$script>;
- close($script);
- my @types = ();
-
- for ($text =~ /(?:(?:\bCHK|\bWARN|\bERROR|&\{\$msg_level})\s*\(|\$msg_type\s*=)\s*"([^"]+)"/g) {
- push (@types, $_);
- }
- @types = sort(uniq(@types));
- print("#\tMessage type\n\n");
- foreach my $type (@types) {
- print(++$count . "\t" . $type . "\n");
- }
- exit($exitcode);
- }
- my $conf = which_conf($configuration_file);
- if (-f $conf) {
- my @conf_args;
- open(my $conffile, '<', "$conf")
- or warn "$P: Can't find a readable $configuration_file file $!\n";
- while (<$conffile>) {
- my $line = $_;
- $line =~ s/\s*\n?$//g;
- $line =~ s/^\s*//g;
- $line =~ s/\s+/ /g;
- next if ($line =~ m/^\s*#/);
- next if ($line =~ m/^\s*$/);
- my @words = split(" ", $line);
- foreach my $word (@words) {
- last if ($word =~ m/^#/);
- push (@conf_args, $word);
- }
- }
- close($conffile);
- unshift(@ARGV, @conf_args) if @conf_args;
- }
- foreach (@ARGV) {
- if ($_ eq "--color" || $_ eq "-color") {
- $_ = "--color=$color";
- }
- }
- GetOptions(
- 'q|quiet+' => \$quiet,
- 'tree!' => \$tree,
- 'signoff!' => \$chk_signoff,
- 'patch!' => \$chk_patch,
- 'emacs!' => \$emacs,
- 'terse!' => \$terse,
- 'showfile!' => \$showfile,
- 'f|file!' => \$file,
- 'g|git!' => \$git,
- 'subjective!' => \$check,
- 'strict!' => \$check,
- 'ignore=s' => \@ignore,
- 'exclude=s' => \@exclude,
- 'types=s' => \@use,
- 'show-types!' => \$show_types,
- 'list-types!' => \$list_types,
- 'max-line-length=i' => \$max_line_length,
- 'min-conf-desc-length=i' => \$min_conf_desc_length,
- 'tab-size=i' => \$tabsize,
- 'root=s' => \$root,
- 'summary!' => \$summary,
- 'mailback!' => \$mailback,
- 'summary-file!' => \$summary_file,
- 'fix!' => \$fix,
- 'fix-inplace!' => \$fix_inplace,
- 'ignore-perl-version!' => \$ignore_perl_version,
- 'debug=s' => \%debug,
- 'test-only=s' => \$tst_only,
- 'codespell!' => \$codespell,
- 'codespellfile=s' => \$codespellfile,
- 'typedefsfile=s' => \$typedefsfile,
- 'color=s' => \$color,
- 'no-color' => \$color,
- 'nocolor' => \$color,
- 'h|help' => \$help,
- 'version' => \$help
- ) or help(1);
- help(0) if ($help);
- list_types(0) if ($list_types);
- $fix = 1 if ($fix_inplace);
- $check_orig = $check;
- die "$P: --git cannot be used with --file or --fix\n" if ($git && ($file || $fix));
- my $exit = 0;
- my $perl_version_ok = 1;
- if ($^V && $^V lt $minimum_perl_version) {
- $perl_version_ok = 0;
- printf "$P: requires at least perl version %vd\n", $minimum_perl_version;
- exit(1) if (!$ignore_perl_version);
- }
- if ($#ARGV < 0) {
- push(@ARGV, '-');
- }
- if ($color =~ /^[01]$/) {
- $color = !$color;
- } elsif ($color =~ /^always$/i) {
- $color = 1;
- } elsif ($color =~ /^never$/i) {
- $color = 0;
- } elsif ($color =~ /^auto$/i) {
- $color = (-t STDOUT);
- } else {
- die "$P: Invalid color mode: $color\n";
- }
- die "$P: Invalid TAB size: $tabsize\n" if ($tabsize < 2);
- sub hash_save_array_words {
- my ($hashRef, $arrayRef) = @_;
- my @array = split(/,/, join(',', @$arrayRef));
- foreach my $word (@array) {
- $word =~ s/\s*\n?$//g;
- $word =~ s/^\s*//g;
- $word =~ s/\s+/ /g;
- $word =~ tr/[a-z]/[A-Z]/;
- next if ($word =~ m/^\s*#/);
- next if ($word =~ m/^\s*$/);
- $hashRef->{$word}++;
- }
- }
- sub hash_show_words {
- my ($hashRef, $prefix) = @_;
- if (keys %$hashRef) {
- print "\nNOTE: $prefix message types:";
- foreach my $word (sort keys %$hashRef) {
- print " $word";
- }
- print "\n";
- }
- }
- hash_save_array_words(\%ignore_type, \@ignore);
- hash_save_array_words(\%use_type, \@use);
- my $dbg_values = 0;
- my $dbg_possible = 0;
- my $dbg_type = 0;
- my $dbg_attr = 0;
- for my $key (keys %debug) {
-
- eval "\${dbg_$key} = '$debug{$key}';";
- die "$@" if ($@);
- }
- my $rpt_cleaners = 0;
- if ($terse) {
- $emacs = 1;
- $quiet++;
- }
- if ($tree) {
- if (defined $root) {
- if (!top_of_kernel_tree($root)) {
- die "$P: $root: --root does not point at a valid tree\n";
- }
- } else {
- if (top_of_kernel_tree('.')) {
- $root = '.';
- } elsif ($0 =~ m@(.*)/scripts/[^/]*$@ &&
- top_of_kernel_tree($1)) {
- $root = $1;
- }
- }
- if (!defined $root) {
- print "Must be run from the top-level dir. of a kernel tree\n";
- exit(2);
- }
- }
- my $emitted_corrupt = 0;
- our $Ident = qr{
- [A-Za-z_][A-Za-z\d_]*
- (?:\s*\#\#\s*[A-Za-z_][A-Za-z\d_]*)*
- }x;
- our $Storage = qr{extern|static|asmlinkage};
- our $Sparse = qr{
- __user|
- __force|
- __iomem|
- __must_check|
- __kprobes|
- __ref|
- __refconst|
- __refdata|
- __rcu|
- __private
- }x;
- our $InitAttributePrefix = qr{__(?:mem|cpu|dev|net_|)};
- our $InitAttributeData = qr{$InitAttributePrefix(?:initdata\b)};
- our $InitAttributeConst = qr{$InitAttributePrefix(?:initconst\b)};
- our $InitAttributeInit = qr{$InitAttributePrefix(?:init\b)};
- our $InitAttribute = qr{$InitAttributeData|$InitAttributeConst|$InitAttributeInit};
- # Notes to $Attribute:
- # We need \b after 'init' otherwise 'initconst' will cause a false positive in a check
- our $Attribute = qr{
- const|
- __percpu|
- __nocast|
- __safe|
- __bitwise|
- __packed__|
- __packed2__|
- __naked|
- __maybe_unused|
- __always_unused|
- __noreturn|
- __used|
- __cold|
- __pure|
- __noclone|
- __deprecated|
- __read_mostly|
- __ro_after_init|
- __kprobes|
- $InitAttribute|
- ____cacheline_aligned|
- ____cacheline_aligned_in_smp|
- ____cacheline_internodealigned_in_smp|
- __weak|
- __syscall
- }x;
- our $Modifier;
- our $Inline = qr{inline|__always_inline|noinline|__inline|__inline__};
- our $Member = qr{->$Ident|\.$Ident|\[[^]]*\]};
- our $Lval = qr{$Ident(?:$Member)*};
- our $Int_type = qr{(?i)llu|ull|ll|lu|ul|l|u};
- our $Binary = qr{(?i)0b[01]+$Int_type?};
- our $Hex = qr{(?i)0x[0-9a-f]+$Int_type?};
- our $Int = qr{[0-9]+$Int_type?};
- our $Octal = qr{0[0-7]+$Int_type?};
- our $String = qr{"[X\t]*"};
- our $Float_hex = qr{(?i)0x[0-9a-f]+p-?[0-9]+[fl]?};
- our $Float_dec = qr{(?i)(?:[0-9]+\.[0-9]*|[0-9]*\.[0-9]+)(?:e-?[0-9]+)?[fl]?};
- our $Float_int = qr{(?i)[0-9]+e-?[0-9]+[fl]?};
- our $Float = qr{$Float_hex|$Float_dec|$Float_int};
- our $Constant = qr{$Float|$Binary|$Octal|$Hex|$Int};
- our $Assignment = qr{\*\=|/=|%=|\+=|-=|<<=|>>=|&=|\^=|\|=|=};
- our $Compare = qr{<=|>=|==|!=|<|(?<!-)>};
- our $Arithmetic = qr{\+|-|\*|\/|%};
- our $Operators = qr{
- <=|>=|==|!=|
- =>|->|<<|>>|<|>|!|~|
- &&|\|\||,|\^|\+\+|--|&|\||$Arithmetic
- }x;
- our $c90_Keywords = qr{do|for|while|if|else|return|goto|continue|switch|default|case|break}x;
- our $BasicType;
- our $NonptrType;
- our $NonptrTypeMisordered;
- our $NonptrTypeWithAttr;
- our $Type;
- our $TypeMisordered;
- our $Declare;
- our $DeclareMisordered;
- our $NON_ASCII_UTF8 = qr{
- [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
- | \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
- | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}
- | \xED[\x80-\x9F][\x80-\xBF]
- | \xF0[\x90-\xBF][\x80-\xBF]{2}
- | [\xF1-\xF3][\x80-\xBF]{3}
- | \xF4[\x80-\x8F][\x80-\xBF]{2}
- }x;
- our $UTF8 = qr{
- [\x09\x0A\x0D\x20-\x7E] # ASCII
- | $NON_ASCII_UTF8
- }x;
- our $typeC99Typedefs = qr{(?:__)?(?:[us]_?)?int_?(?:8|16|32|64)_t};
- our $typeOtherOSTypedefs = qr{(?x:
- u_(?:char|short|int|long) | # bsd
- u(?:nchar|short|int|long) # sysv
- )};
- our $typeKernelTypedefs = qr{(?x:
- (?:__)?(?:u|s|be|le)(?:8|16|32|64)|
- atomic_t
- )};
- our $typeTypedefs = qr{(?x:
- $typeC99Typedefs\b|
- $typeOtherOSTypedefs\b|
- $typeKernelTypedefs\b
- )};
- our $zero_initializer = qr{(?:(?:0[xX])?0+$Int_type?|NULL|false)\b};
- our $logFunctions = qr{(?x:
- printk(?:_ratelimited|_once|_deferred_once|_deferred|)|
- (?:[a-z0-9]+_){1,2}(?:printk|emerg|alert|crit|err|warning|warn|notice|info|debug|dbg|vdbg|devel|cont|WARN)(?:_ratelimited|_once|)|
- TP_printk|
- WARN(?:_RATELIMIT|_ONCE|)|
- panic|
- MODULE_[A-Z_]+|
- seq_vprintf|seq_printf|seq_puts
- )};
- our $allocFunctions = qr{(?x:
- (?:(?:devm_)?
- (?:kv|k|v)[czm]alloc(?:_node|_array)? |
- kstrdup(?:_const)? |
- kmemdup(?:_nul)?) |
- (?:\w+)?alloc_skb(?:_ip_align)? |
- # dev_alloc_skb/netdev_alloc_skb, et al
- dma_alloc_coherent
- )};
- our $signature_tags = qr{(?xi:
- Signed-off-by:|
- Co-developed-by:|
- Acked-by:|
- Tested-by:|
- Reviewed-by:|
- Reported-by:|
- Suggested-by:|
- To:|
- Cc:
- )};
- our @typeListMisordered = (
- qr{char\s+(?:un)?signed},
- qr{int\s+(?:(?:un)?signed\s+)?short\s},
- qr{int\s+short(?:\s+(?:un)?signed)},
- qr{short\s+int(?:\s+(?:un)?signed)},
- qr{(?:un)?signed\s+int\s+short},
- qr{short\s+(?:un)?signed},
- qr{long\s+int\s+(?:un)?signed},
- qr{int\s+long\s+(?:un)?signed},
- qr{long\s+(?:un)?signed\s+int},
- qr{int\s+(?:un)?signed\s+long},
- qr{int\s+(?:un)?signed},
- qr{int\s+long\s+long\s+(?:un)?signed},
- qr{long\s+long\s+int\s+(?:un)?signed},
- qr{long\s+long\s+(?:un)?signed\s+int},
- qr{long\s+long\s+(?:un)?signed},
- qr{long\s+(?:un)?signed},
- );
- our @typeList = (
- qr{void},
- qr{(?:(?:un)?signed\s+)?char},
- qr{(?:(?:un)?signed\s+)?short\s+int},
- qr{(?:(?:un)?signed\s+)?short},
- qr{(?:(?:un)?signed\s+)?int},
- qr{(?:(?:un)?signed\s+)?long\s+int},
- qr{(?:(?:un)?signed\s+)?long\s+long\s+int},
- qr{(?:(?:un)?signed\s+)?long\s+long},
- qr{(?:(?:un)?signed\s+)?long},
- qr{(?:un)?signed},
- qr{float},
- qr{double},
- qr{bool},
- qr{struct\s+$Ident},
- qr{union\s+$Ident},
- qr{enum\s+$Ident},
- qr{${Ident}_t},
- qr{${Ident}_handler},
- qr{${Ident}_handler_fn},
- @typeListMisordered,
- );
- our $C90_int_types = qr{(?x:
- long\s+long\s+int\s+(?:un)?signed|
- long\s+long\s+(?:un)?signed\s+int|
- long\s+long\s+(?:un)?signed|
- (?:(?:un)?signed\s+)?long\s+long\s+int|
- (?:(?:un)?signed\s+)?long\s+long|
- int\s+long\s+long\s+(?:un)?signed|
- int\s+(?:(?:un)?signed\s+)?long\s+long|
- long\s+int\s+(?:un)?signed|
- long\s+(?:un)?signed\s+int|
- long\s+(?:un)?signed|
- (?:(?:un)?signed\s+)?long\s+int|
- (?:(?:un)?signed\s+)?long|
- int\s+long\s+(?:un)?signed|
- int\s+(?:(?:un)?signed\s+)?long|
- int\s+(?:un)?signed|
- (?:(?:un)?signed\s+)?int
- )};
- our @typeListFile = ();
- our @typeListWithAttr = (
- @typeList,
- qr{struct\s+$InitAttribute\s+$Ident},
- qr{union\s+$InitAttribute\s+$Ident},
- );
- our @modifierList = (
- qr{fastcall},
- );
- our @modifierListFile = ();
- our @mode_permission_funcs = (
- ["module_param", 3],
- ["module_param_(?:array|named|string)", 4],
- ["module_param_array_named", 5],
- ["debugfs_create_(?:file|u8|u16|u32|u64|x8|x16|x32|x64|size_t|atomic_t|bool|blob|regset32|u32_array)", 2],
- ["proc_create(?:_data|)", 2],
- ["(?:CLASS|DEVICE|SENSOR|SENSOR_DEVICE|IIO_DEVICE)_ATTR", 2],
- ["IIO_DEV_ATTR_[A-Z_]+", 1],
- ["SENSOR_(?:DEVICE_|)ATTR_2", 2],
- ["SENSOR_TEMPLATE(?:_2|)", 3],
- ["__ATTR", 2],
- );
- my $word_pattern = '\b[A-Z]?[a-z]{2,}\b';
- our $mode_perms_search = "";
- foreach my $entry (@mode_permission_funcs) {
- $mode_perms_search .= '|' if ($mode_perms_search ne "");
- $mode_perms_search .= $entry->[0];
- }
- $mode_perms_search = "(?:${mode_perms_search})";
- our %deprecated_apis = (
- "synchronize_rcu_bh" => "synchronize_rcu",
- "synchronize_rcu_bh_expedited" => "synchronize_rcu_expedited",
- "call_rcu_bh" => "call_rcu",
- "rcu_barrier_bh" => "rcu_barrier",
- "synchronize_sched" => "synchronize_rcu",
- "synchronize_sched_expedited" => "synchronize_rcu_expedited",
- "call_rcu_sched" => "call_rcu",
- "rcu_barrier_sched" => "rcu_barrier",
- "get_state_synchronize_sched" => "get_state_synchronize_rcu",
- "cond_synchronize_sched" => "cond_synchronize_rcu",
- );
- our $deprecated_apis_search = "";
- foreach my $entry (keys %deprecated_apis) {
- $deprecated_apis_search .= '|' if ($deprecated_apis_search ne "");
- $deprecated_apis_search .= $entry;
- }
- $deprecated_apis_search = "(?:${deprecated_apis_search})";
- our $mode_perms_world_writable = qr{
- S_IWUGO |
- S_IWOTH |
- S_IRWXUGO |
- S_IALLUGO |
- 0[0-7][0-7][2367]
- }x;
- our %mode_permission_string_types = (
- "S_IRWXU" => 0700,
- "S_IRUSR" => 0400,
- "S_IWUSR" => 0200,
- "S_IXUSR" => 0100,
- "S_IRWXG" => 0070,
- "S_IRGRP" => 0040,
- "S_IWGRP" => 0020,
- "S_IXGRP" => 0010,
- "S_IRWXO" => 0007,
- "S_IROTH" => 0004,
- "S_IWOTH" => 0002,
- "S_IXOTH" => 0001,
- "S_IRWXUGO" => 0777,
- "S_IRUGO" => 0444,
- "S_IWUGO" => 0222,
- "S_IXUGO" => 0111,
- );
- our $mode_perms_string_search = "";
- foreach my $entry (keys %mode_permission_string_types) {
- $mode_perms_string_search .= '|' if ($mode_perms_string_search ne "");
- $mode_perms_string_search .= $entry;
- }
- our $single_mode_perms_string_search = "(?:${mode_perms_string_search})";
- our $multi_mode_perms_string_search = qr{
- ${single_mode_perms_string_search}
- (?:\s*\|\s*${single_mode_perms_string_search})*
- }x;
- sub perms_to_octal {
- my ($string) = @_;
- return trim($string) if ($string =~ /^\s*0[0-7]{3,3}\s*$/);
- my $val = "";
- my $oval = "";
- my $to = 0;
- my $curpos = 0;
- my $lastpos = 0;
- while ($string =~ /\b(($single_mode_perms_string_search)\b(?:\s*\|\s*)?\s*)/g) {
- $curpos = pos($string);
- my $match = $2;
- my $omatch = $1;
- last if ($lastpos > 0 && ($curpos - length($omatch) != $lastpos));
- $lastpos = $curpos;
- $to |= $mode_permission_string_types{$match};
- $val .= '\s*\|\s*' if ($val ne "");
- $val .= $match;
- $oval .= $omatch;
- }
- $oval =~ s/^\s*\|\s*//;
- $oval =~ s/\s*\|\s*$//;
- return sprintf("%04o", $to);
- }
- our $allowed_asm_includes = qr{(?x:
- irq|
- memory|
- time|
- reboot
- )};
- my $misspellings;
- my %spelling_fix;
- if (open(my $spelling, '<', $spelling_file)) {
- while (<$spelling>) {
- my $line = $_;
- $line =~ s/\s*\n?$//g;
- $line =~ s/^\s*//g;
- next if ($line =~ m/^\s*#/);
- next if ($line =~ m/^\s*$/);
- my ($suspect, $fix) = split(/\|\|/, $line);
- $spelling_fix{$suspect} = $fix;
- }
- close($spelling);
- } else {
- warn "No typos will be found - file '$spelling_file': $!\n";
- }
- if ($codespell) {
- if (open(my $spelling, '<', $codespellfile)) {
- while (<$spelling>) {
- my $line = $_;
- $line =~ s/\s*\n?$//g;
- $line =~ s/^\s*//g;
- next if ($line =~ m/^\s*#/);
- next if ($line =~ m/^\s*$/);
- next if ($line =~ m/, disabled/i);
- $line =~ s/,.*$//;
- my ($suspect, $fix) = split(/->/, $line);
- $spelling_fix{$suspect} = $fix;
- }
- close($spelling);
- } else {
- warn "No codespell typos will be found - file '$codespellfile': $!\n";
- }
- }
- $misspellings = join("|", sort keys %spelling_fix) if keys %spelling_fix;
- sub read_words {
- my ($wordsRef, $file) = @_;
- if (open(my $words, '<', $file)) {
- while (<$words>) {
- my $line = $_;
- $line =~ s/\s*\n?$//g;
- $line =~ s/^\s*//g;
- next if ($line =~ m/^\s*#/);
- next if ($line =~ m/^\s*$/);
- if ($line =~ /\s/) {
- print("$file: '$line' invalid - ignored\n");
- next;
- }
- $$wordsRef .= '|' if (defined $$wordsRef);
- $$wordsRef .= $line;
- }
- close($file);
- return 1;
- }
- return 0;
- }
- my $const_structs;
- if (defined($typedefsfile)) {
- my $typeOtherTypedefs;
- read_words(\$typeOtherTypedefs, $typedefsfile)
- or warn "No additional types will be considered - file '$typedefsfile': $!\n";
- $typeTypedefs .= '|' . $typeOtherTypedefs if (defined $typeOtherTypedefs);
- }
- sub build_types {
- my $mods = "(?x: \n" . join("|\n ", (@modifierList, @modifierListFile)) . "\n)";
- my $all = "(?x: \n" . join("|\n ", (@typeList, @typeListFile)) . "\n)";
- my $Misordered = "(?x: \n" . join("|\n ", @typeListMisordered) . "\n)";
- my $allWithAttr = "(?x: \n" . join("|\n ", @typeListWithAttr) . "\n)";
- $Modifier = qr{(?:$Attribute|$Sparse|$mods)};
- $BasicType = qr{
- (?:$typeTypedefs\b)|
- (?:${all}\b)
- }x;
- $NonptrType = qr{
- (?:$Modifier\s+|const\s+)*
- (?:
- (?:typeof|__typeof__)\s*\([^\)]*\)|
- (?:$typeTypedefs\b)|
- (?:${all}\b)
- )
- (?:\s+$Modifier|\s+const)*
- }x;
- $NonptrTypeMisordered = qr{
- (?:$Modifier\s+|const\s+)*
- (?:
- (?:${Misordered}\b)
- )
- (?:\s+$Modifier|\s+const)*
- }x;
- $NonptrTypeWithAttr = qr{
- (?:$Modifier\s+|const\s+)*
- (?:
- (?:typeof|__typeof__)\s*\([^\)]*\)|
- (?:$typeTypedefs\b)|
- (?:${allWithAttr}\b)
- )
- (?:\s+$Modifier|\s+const)*
- }x;
- $Type = qr{
- $NonptrType
- (?:(?:\s|\*|\[\])+\s*const|(?:\s|\*\s*(?:const\s*)?|\[\])+|(?:\s*\[\s*\])+){0,4}
- (?:\s+$Inline|\s+$Modifier)*
- }x;
- $TypeMisordered = qr{
- $NonptrTypeMisordered
- (?:(?:\s|\*|\[\])+\s*const|(?:\s|\*\s*(?:const\s*)?|\[\])+|(?:\s*\[\s*\])+){0,4}
- (?:\s+$Inline|\s+$Modifier)*
- }x;
- $Declare = qr{(?:$Storage\s+(?:$Inline\s+)?)?$Type};
- $DeclareMisordered = qr{(?:$Storage\s+(?:$Inline\s+)?)?$TypeMisordered};
- }
- build_types();
- our $Typecast = qr{\s*(\(\s*$NonptrType\s*\)){0,1}\s*};
- our $balanced_parens = qr/(\((?:[^\(\)]++|(?-1))*\))/;
- our $LvalOrFunc = qr{((?:[\&\*]\s*)?$Lval)\s*($balanced_parens{0,1})\s*};
- our $FuncArg = qr{$Typecast{0,1}($LvalOrFunc|$Constant|$String)};
- our $declaration_macros = qr{(?x:
- (?:$Storage\s+)?(?:[A-Z_][A-Z0-9]*_){0,2}(?:DEFINE|DECLARE)(?:_[A-Z0-9]+){1,6}\s*\(|
- (?:$Storage\s+)?[HLP]?LIST_HEAD\s*\(|
- (?:SKCIPHER_REQUEST|SHASH_DESC|AHASH_REQUEST)_ON_STACK\s*\(
- )};
- sub deparenthesize {
- my ($string) = @_;
- return "" if (!defined($string));
- while ($string =~ /^\s*\(.*\)\s*$/) {
- $string =~ s@^\s*\(\s*@@;
- $string =~ s@\s*\)\s*$@@;
- }
- $string =~ s@\s+@ @g;
- return $string;
- }
- sub seed_camelcase_file {
- my ($file) = @_;
- return if (!(-f $file));
- local $/;
- open(my $include_file, '<', "$file")
- or warn "$P: Can't read '$file' $!\n";
- my $text = <$include_file>;
- close($include_file);
- my @lines = split('\n', $text);
- foreach my $line (@lines) {
- next if ($line !~ /(?:[A-Z][a-z]|[a-z][A-Z])/);
- if ($line =~ /^[ \t]*(?:#[ \t]*define|typedef\s+$Type)\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)/) {
- $camelcase{$1} = 1;
- } elsif ($line =~ /^\s*$Declare\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)\s*[\(\[,;]/) {
- $camelcase{$1} = 1;
- } elsif ($line =~ /^\s*(?:union|struct|enum)\s+(\w*(?:[A-Z][a-z]|[a-z][A-Z])\w*)\s*[;\{]/) {
- $camelcase{$1} = 1;
- }
- }
- }
- our %maintained_status = ();
- sub is_maintained_obsolete {
- my ($filename) = @_;
- return 0 if (!$tree || !(-e "$root/scripts/get_maintainer.pl"));
- if (!exists($maintained_status{$filename})) {
- $maintained_status{$filename} = `perl $root/scripts/get_maintainer.pl --status --nom --nol --nogit --nogit-fallback -f $filename 2>&1`;
- }
- return $maintained_status{$filename} =~ /obsolete/i;
- }
- sub is_SPDX_License_valid {
- my ($license) = @_;
- return 1 if (!$tree || which("python") eq "" || !(-e "$root/scripts/spdxcheck.py") || !(-e "$root/.git"));
- my $root_path = abs_path($root);
- my $status = `cd "$root_path"; echo "$license" | python scripts/spdxcheck.py -`;
- return 0 if ($status ne "");
- return 1;
- }
- my $camelcase_seeded = 0;
- sub seed_camelcase_includes {
- return if ($camelcase_seeded);
- my $files;
- my $camelcase_cache = "";
- my @include_files = ();
- $camelcase_seeded = 1;
- if (-e ".git") {
- my $git_last_include_commit = `${git_command} log --no-merges --pretty=format:"%h%n" -1 -- include`;
- chomp $git_last_include_commit;
- $camelcase_cache = ".checkpatch-camelcase.git.$git_last_include_commit";
- } else {
- my $last_mod_date = 0;
- $files = `find $root/include -name "*.h"`;
- @include_files = split('\n', $files);
- foreach my $file (@include_files) {
- my $date = POSIX::strftime("%Y%m%d%H%M",
- localtime((stat $file)[9]));
- $last_mod_date = $date if ($last_mod_date < $date);
- }
- $camelcase_cache = ".checkpatch-camelcase.date.$last_mod_date";
- }
- if ($camelcase_cache ne "" && -f $camelcase_cache) {
- open(my $camelcase_file, '<', "$camelcase_cache")
- or warn "$P: Can't read '$camelcase_cache' $!\n";
- while (<$camelcase_file>) {
- chomp;
- $camelcase{$_} = 1;
- }
- close($camelcase_file);
- return;
- }
- if (-e ".git") {
- $files = `${git_command} ls-files "include/*.h"`;
- @include_files = split('\n', $files);
- }
- foreach my $file (@include_files) {
- seed_camelcase_file($file);
- }
- if ($camelcase_cache ne "") {
- unlink glob ".checkpatch-camelcase.*";
- open(my $camelcase_file, '>', "$camelcase_cache")
- or warn "$P: Can't write '$camelcase_cache' $!\n";
- foreach (sort { lc($a) cmp lc($b) } keys(%camelcase)) {
- print $camelcase_file ("$_\n");
- }
- close($camelcase_file);
- }
- }
- sub git_commit_info {
- my ($commit, $id, $desc) = @_;
- return ($id, $desc) if ((which("git") eq "") || !(-e ".git"));
- my $output = `${git_command} log --no-color --format='%H %s' -1 $commit 2>&1`;
- $output =~ s/^\s*//gm;
- my @lines = split("\n", $output);
- return ($id, $desc) if ($#lines < 0);
- if ($lines[0] =~ /^error: short SHA1 $commit is ambiguous/) {
- } elsif ($lines[0] =~ /^fatal: ambiguous argument '$commit': unknown revision or path not in the working tree\./) {
- $id = undef;
- } else {
- $id = substr($lines[0], 0, 12);
- $desc = substr($lines[0], 41);
- }
- return ($id, $desc);
- }
- $chk_signoff = 0 if ($file);
- my @rawlines = ();
- my @lines = ();
- my @fixed = ();
- my @fixed_inserted = ();
- my @fixed_deleted = ();
- my $fixlinenr = -1;
- die "$P: No git repository found\n" if ($git && !-e ".git");
- if ($git) {
- my @commits = ();
- foreach my $commit_expr (@ARGV) {
- my $git_range;
- if ($commit_expr =~ m/^(.*)-(\d+)$/) {
- $git_range = "-$2 $1";
- } elsif ($commit_expr =~ m/\.\./) {
- $git_range = "$commit_expr";
- } else {
- $git_range = "-1 $commit_expr";
- }
- my $lines = `${git_command} log --no-color --no-merges --pretty=format:'%H %s' $git_range`;
- foreach my $line (split(/\n/, $lines)) {
- $line =~ /^([0-9a-fA-F]{40,40}) (.*)$/;
- next if (!defined($1) || !defined($2));
- my $sha1 = $1;
- my $subject = $2;
- unshift(@commits, $sha1);
- $git_commits{$sha1} = $subject;
- }
- }
- die "$P: no git commits after extraction!\n" if (@commits == 0);
- @ARGV = @commits;
- }
- my $vname;
- $allow_c99_comments = !defined $ignore_type{"C99_COMMENT_TOLERANCE"};
- for my $filename (@ARGV) {
- my $FILE;
- if ($git) {
- open($FILE, '-|', "git format-patch -M --stdout -1 $filename") ||
- die "$P: $filename: git format-patch failed - $!\n";
- } elsif ($file) {
- open($FILE, '-|', "diff -u /dev/null $filename") ||
- die "$P: $filename: diff failed - $!\n";
- } elsif ($filename eq '-') {
- open($FILE, '<&STDIN');
- } else {
- open($FILE, '<', "$filename") ||
- die "$P: $filename: open failed - $!\n";
- }
- if ($filename eq '-') {
- $vname = 'Your patch';
- } elsif ($git) {
- $vname = "Commit " . substr($filename, 0, 12) . ' ("' . $git_commits{$filename} . '")';
- } else {
- $vname = $filename;
- }
- while (<$FILE>) {
- chomp;
- push(@rawlines, $_);
- $vname = qq("$1") if ($filename eq '-' && $_ =~ m/^Subject:\s+(.+)/i);
- }
- close($FILE);
- if ($#ARGV > 0 && $quiet == 0) {
- print '-' x length($vname) . "\n";
- print "$vname\n";
- print '-' x length($vname) . "\n";
- }
- if (!process($filename)) {
- $exit = 1;
- }
- @rawlines = ();
- @lines = ();
- @fixed = ();
- @fixed_inserted = ();
- @fixed_deleted = ();
- $fixlinenr = -1;
- @modifierListFile = ();
- @typeListFile = ();
- build_types();
- }
- if (!$quiet) {
- hash_show_words(\%use_type, "Used");
- hash_show_words(\%ignore_type, "Ignored");
- if (!$perl_version_ok) {
- print << "EOM"
- NOTE: perl $^V is not modern enough to detect all possible issues.
- An upgrade to at least perl $minimum_perl_version is suggested.
- EOM
- }
- if ($exit) {
- print << "EOM"
- NOTE: If any of the errors are false positives, please report
- them to the maintainers.
- EOM
- }
- }
- exit($exit);
- sub top_of_kernel_tree {
- my ($root) = @_;
- my @tree_check = (
- "LICENSE", "CODEOWNERS", "Kconfig", "README.rst",
- "doc", "arch", "include", "drivers", "boards",
- "kernel", "lib", "scripts",
- );
- foreach my $check (@tree_check) {
- if (! -e $root . '/' . $check) {
- return 0;
- }
- }
- return 1;
- }
- sub parse_email {
- my ($formatted_email) = @_;
- my $name = "";
- my $address = "";
- my $comment = "";
- if ($formatted_email =~ /^(.*)<(\S+\@\S+)>(.*)$/) {
- $name = $1;
- $address = $2;
- $comment = $3 if defined $3;
- } elsif ($formatted_email =~ /^\s*<(\S+\@\S+)>(.*)$/) {
- $address = $1;
- $comment = $2 if defined $2;
- } elsif ($formatted_email =~ /(\S+\@\S+)(.*)$/) {
- $address = $1;
- $comment = $2 if defined $2;
- $formatted_email =~ s/\Q$address\E.*$//;
- $name = $formatted_email;
- $name = trim($name);
- $name =~ s/^\"|\"$//g;
-
-
-
-
-
-
- if ($name ne "" && $address !~ /^<[^>]+>$/) {
- $name = "";
- $address = "";
- $comment = "";
- }
- }
- $name = trim($name);
- $name =~ s/^\"|\"$//g;
- $address = trim($address);
- $address =~ s/^\<|\>$//g;
- if ($name =~ /[^\w \-]/i) {
- $name =~ s/(?<!\\)"/\\"/g;
- $name = "\"$name\"";
- }
- return ($name, $address, $comment);
- }
- sub format_email {
- my ($name, $address) = @_;
- my $formatted_email;
- $name = trim($name);
- $name =~ s/^\"|\"$//g;
- $address = trim($address);
- if ($name =~ /[^\w \-]/i) {
- $name =~ s/(?<!\\)"/\\"/g;
- $name = "\"$name\"";
- }
- if ("$name" eq "") {
- $formatted_email = "$address";
- } else {
- $formatted_email = "$name <$address>";
- }
- return $formatted_email;
- }
- sub which {
- my ($bin) = @_;
- foreach my $path (split(/:/, $ENV{PATH})) {
- if (-e "$path/$bin") {
- return "$path/$bin";
- }
- }
- return "";
- }
- sub which_conf {
- my ($conf) = @_;
- foreach my $path (split(/:/, ".:$ENV{HOME}:.scripts")) {
- if (-e "$path/$conf") {
- return "$path/$conf";
- }
- }
- return "";
- }
- sub expand_tabs {
- my ($str) = @_;
- my $res = '';
- my $n = 0;
- for my $c (split(//, $str)) {
- if ($c eq "\t") {
- $res .= ' ';
- $n++;
- for (; ($n % $tabsize) != 0; $n++) {
- $res .= ' ';
- }
- next;
- }
- $res .= $c;
- $n++;
- }
- return $res;
- }
- sub copy_spacing {
- (my $res = shift) =~ tr/\t/ /c;
- return $res;
- }
- sub line_stats {
- my ($line) = @_;
-
- $line =~ s/^.//;
- $line = expand_tabs($line);
-
- my ($white) = ($line =~ /^(\s*)/);
- return (length($line), length($white));
- }
- my $sanitise_quote = '';
- sub sanitise_line_reset {
- my ($in_comment) = @_;
- if ($in_comment) {
- $sanitise_quote = '*/';
- } else {
- $sanitise_quote = '';
- }
- }
- sub sanitise_line {
- my ($line) = @_;
- my $res = '';
- my $l = '';
- my $qlen = 0;
- my $off = 0;
- my $c;
-
- $res = substr($line, 0, 1);
- for ($off = 1; $off < length($line); $off++) {
- $c = substr($line, $off, 1);
-
-
- if ($sanitise_quote eq '' && substr($line, $off, 2) eq '/*') {
- $sanitise_quote = '*/';
- substr($res, $off, 2, "$;$;");
- $off++;
- next;
- }
- if ($sanitise_quote eq '*/' && substr($line, $off, 2) eq '*/') {
- $sanitise_quote = '';
- substr($res, $off, 2, "$;$;");
- $off++;
- next;
- }
- if ($sanitise_quote eq '' && substr($line, $off, 2) eq '//') {
- $sanitise_quote = '//';
- substr($res, $off, 2, $sanitise_quote);
- $off++;
- next;
- }
-
- if (($sanitise_quote eq "'" || $sanitise_quote eq '"') &&
- $c eq "\\") {
- substr($res, $off, 2, 'XX');
- $off++;
- next;
- }
-
- if ($c eq "'" || $c eq '"') {
- if ($sanitise_quote eq '') {
- $sanitise_quote = $c;
- substr($res, $off, 1, $c);
- next;
- } elsif ($sanitise_quote eq $c) {
- $sanitise_quote = '';
- }
- }
-
- if ($off != 0 && $sanitise_quote eq '*/' && $c ne "\t") {
- substr($res, $off, 1, $;);
- } elsif ($off != 0 && $sanitise_quote eq '//' && $c ne "\t") {
- substr($res, $off, 1, $;);
- } elsif ($off != 0 && $sanitise_quote && $c ne "\t") {
- substr($res, $off, 1, 'X');
- } else {
- substr($res, $off, 1, $c);
- }
- }
- if ($sanitise_quote eq '//') {
- $sanitise_quote = '';
- }
-
- if ($res =~ /^.\s*\#\s*include\s+\<(.*)\>/) {
- my $clean = 'X' x length($1);
- $res =~ s@\<.*\>@<$clean>@;
-
- } elsif ($res =~ /^.\s*\#\s*(?:error|warning)\s+(.*)\b/) {
- my $clean = 'X' x length($1);
- $res =~ s@(\
- }
- if ($allow_c99_comments && $res =~ m@(//.*$)@) {
- my $match = $1;
- $res =~ s/\Q$match\E/"$;" x length($match)/e;
- }
- return $res;
- }
- sub get_quoted_string {
- my ($line, $rawline) = @_;
- return "" if (!defined($line) || !defined($rawline));
- return "" if ($line !~ m/($String)/g);
- return substr($rawline, $-[0], $+[0] - $-[0]);
- }
- sub ctx_statement_block {
- my ($linenr, $remain, $off) = @_;
- my $line = $linenr - 1;
- my $blk = '';
- my $soff = $off;
- my $coff = $off - 1;
- my $coff_set = 0;
- my $loff = 0;
- my $type = '';
- my $level = 0;
- my @stack = ();
- my $p;
- my $c;
- my $len = 0;
- my $remainder;
- while (1) {
- @stack = (['', 0]) if ($#stack == -1);
-
-
-
- if ($off >= $len) {
- for (; $remain > 0; $line++) {
- last if (!defined $lines[$line]);
- next if ($lines[$line] =~ /^-/);
- $remain--;
- $loff = $len;
- $blk .= $lines[$line] . "\n";
- $len = length($blk);
- $line++;
- last;
- }
-
-
- if ($off >= $len) {
- last;
- }
- if ($level == 0 && substr($blk, $off) =~ /^.\s*#\s*define/) {
- $level++;
- $type = '#';
- }
- }
- $p = $c;
- $c = substr($blk, $off, 1);
- $remainder = substr($blk, $off);
-
-
- if ($remainder =~ /^#\s*(?:ifndef|ifdef|if)\s/) {
- push(@stack, [ $type, $level ]);
- } elsif ($remainder =~ /^#\s*(?:else|elif)\b/) {
- ($type, $level) = @{$stack[$#stack - 1]};
- } elsif ($remainder =~ /^#\s*endif\b/) {
- ($type, $level) = @{pop(@stack)};
- }
-
-
- if ($level == 0 && $c eq ';') {
- last;
- }
-
- if ($level == 0 && $coff_set == 0 &&
- (!defined($p) || $p =~ /(?:\s|\}|\+)/) &&
- $remainder =~ /^(else)(?:\s|{)/ &&
- $remainder !~ /^else\s+if\b/) {
- $coff = $off + length($1) - 1;
- $coff_set = 1;
-
-
- }
- if (($type eq '' || $type eq '(') && $c eq '(') {
- $level++;
- $type = '(';
- }
- if ($type eq '(' && $c eq ')') {
- $level--;
- $type = ($level != 0)? '(' : '';
- if ($level == 0 && $coff < $soff) {
- $coff = $off;
- $coff_set = 1;
-
- }
- }
- if (($type eq '' || $type eq '{') && $c eq '{') {
- $level++;
- $type = '{';
- }
- if ($type eq '{' && $c eq '}') {
- $level--;
- $type = ($level != 0)? '{' : '';
- if ($level == 0) {
- if (substr($blk, $off + 1, 1) eq ';') {
- $off++;
- }
- last;
- }
- }
-
- if ($type eq '#' && $c eq "\n" && $p ne "\\") {
- $level--;
- $type = '';
- $off++;
- last;
- }
- $off++;
- }
-
- if ($off == $len) {
- $loff = $len + 1;
- $line++;
- $remain--;
- }
- my $statement = substr($blk, $soff, $off - $soff + 1);
- my $condition = substr($blk, $soff, $coff - $soff + 1);
-
-
-
- return ($statement, $condition,
- $line, $remain + 1, $off - $loff + 1, $level);
- }
- sub statement_lines {
- my ($stmt) = @_;
-
- $stmt =~ s/(^|\n)./$1/g;
- $stmt =~ s/^\s*//;
- $stmt =~ s/\s*$//;
- my @stmt_lines = ($stmt =~ /\n/g);
- return $#stmt_lines + 2;
- }
- sub statement_rawlines {
- my ($stmt) = @_;
- my @stmt_lines = ($stmt =~ /\n/g);
- return $#stmt_lines + 2;
- }
- sub statement_block_size {
- my ($stmt) = @_;
- $stmt =~ s/(^|\n)./$1/g;
- $stmt =~ s/^\s*{//;
- $stmt =~ s/}\s*$//;
- $stmt =~ s/^\s*//;
- $stmt =~ s/\s*$//;
- my @stmt_lines = ($stmt =~ /\n/g);
- my @stmt_statements = ($stmt =~ /;/g);
- my $stmt_lines = $#stmt_lines + 2;
- my $stmt_statements = $#stmt_statements + 1;
- if ($stmt_lines > $stmt_statements) {
- return $stmt_lines;
- } else {
- return $stmt_statements;
- }
- }
- sub ctx_statement_full {
- my ($linenr, $remain, $off) = @_;
- my ($statement, $condition, $level);
- my (@chunks);
-
- ($statement, $condition, $linenr, $remain, $off, $level) =
- ctx_statement_block($linenr, $remain, $off);
-
- push(@chunks, [ $condition, $statement ]);
- if (!($remain > 0 && $condition =~ /^\s*(?:\n[+-])?\s*(?:if|else|do)\b/s)) {
- return ($level, $linenr, @chunks);
- }
-
-
- for (;;) {
- ($statement, $condition, $linenr, $remain, $off, $level) =
- ctx_statement_block($linenr, $remain, $off);
-
- last if (!($remain > 0 && $condition =~ /^(?:\s*\n[+-])*\s*(?:else|do)\b/s));
-
- push(@chunks, [ $condition, $statement ]);
- }
- return ($level, $linenr, @chunks);
- }
- sub ctx_block_get {
- my ($linenr, $remain, $outer, $open, $close, $off) = @_;
- my $line;
- my $start = $linenr - 1;
- my $blk = '';
- my @o;
- my @c;
- my @res = ();
- my $level = 0;
- my @stack = ($level);
- for ($line = $start; $remain > 0; $line++) {
- next if ($rawlines[$line] =~ /^-/);
- $remain--;
- $blk .= $rawlines[$line];
-
- if ($lines[$line] =~ /^.\s*#\s*(?:ifndef|ifdef|if)\s/) {
- push(@stack, $level);
- } elsif ($lines[$line] =~ /^.\s*#\s*(?:else|elif)\b/) {
- $level = $stack[$#stack - 1];
- } elsif ($lines[$line] =~ /^.\s*#\s*endif\b/) {
- $level = pop(@stack);
- }
- foreach my $c (split(//, $lines[$line])) {
-
- if ($off > 0) {
- $off--;
- next;
- }
- if ($c eq $close && $level > 0) {
- $level--;
- last if ($level == 0);
- } elsif ($c eq $open) {
- $level++;
- }
- }
- if (!$outer || $level <= 1) {
- push(@res, $rawlines[$line]);
- }
- last if ($level == 0);
- }
- return ($level, @res);
- }
- sub ctx_block_outer {
- my ($linenr, $remain) = @_;
- my ($level, @r) = ctx_block_get($linenr, $remain, 1, '{', '}', 0);
- return @r;
- }
- sub ctx_block {
- my ($linenr, $remain) = @_;
- my ($level, @r) = ctx_block_get($linenr, $remain, 0, '{', '}', 0);
- return @r;
- }
- sub ctx_statement {
- my ($linenr, $remain, $off) = @_;
- my ($level, @r) = ctx_block_get($linenr, $remain, 0, '(', ')', $off);
- return @r;
- }
- sub ctx_block_level {
- my ($linenr, $remain) = @_;
- return ctx_block_get($linenr, $remain, 0, '{', '}', 0);
- }
- sub ctx_statement_level {
- my ($linenr, $remain, $off) = @_;
- return ctx_block_get($linenr, $remain, 0, '(', ')', $off);
- }
- sub ctx_locate_comment {
- my ($first_line, $end_line) = @_;
-
- my ($current_comment) = ($rawlines[$end_line - 1] =~ m@^\+.*(//.*$)@);
- return $current_comment if (defined $current_comment);
- ($current_comment) = ($rawlines[$end_line - 2] =~ m@^[\+ ].*(//.*$)@);
- return $current_comment if (defined $current_comment);
- ($current_comment) = ($rawlines[$end_line] =~ m@^[\+ ].*(//.*$)@);
- return $current_comment if (defined $current_comment);
-
- ($current_comment) = ($rawlines[$end_line - 1] =~ m@.*(/\*.*\*/)\s*(?:\\\s*)?$@);
- return $current_comment if (defined $current_comment);
-
-
- my $in_comment = 0;
- $current_comment = '';
- for (my $linenr = $first_line; $linenr < $end_line; $linenr++) {
- my $line = $rawlines[$linenr - 1];
-
- if ($linenr == $first_line and $line =~ m@^.\s*\*@) {
- $in_comment = 1;
- }
- if ($line =~ m@/\*@) {
- $in_comment = 1;
- }
- if (!$in_comment && $current_comment ne '') {
- $current_comment = '';
- }
- $current_comment .= $line . "\n" if ($in_comment);
- if ($line =~ m@\*/@) {
- $in_comment = 0;
- }
- }
- chomp($current_comment);
- return($current_comment);
- }
- sub ctx_has_comment {
- my ($first_line, $end_line) = @_;
- my $cmt = ctx_locate_comment($first_line, $end_line);
- ##print "LINE: $rawlines[$end_line - 1 ]\n";
- ##print "CMMT: $cmt\n";
- return ($cmt ne '');
- }
- sub raw_line {
- my ($linenr, $cnt) = @_;
- my $offset = $linenr - 1;
- $cnt++;
- my $line;
- while ($cnt) {
- $line = $rawlines[$offset++];
- next if (defined($line) && $line =~ /^-/);
- $cnt--;
- }
- return $line;
- }
- sub get_stat_real {
- my ($linenr, $lc) = @_;
- my $stat_real = raw_line($linenr, 0);
- for (my $count = $linenr + 1; $count <= $lc; $count++) {
- $stat_real = $stat_real . "\n" . raw_line($count, 0);
- }
- return $stat_real;
- }
- sub get_stat_here {
- my ($linenr, $cnt, $here) = @_;
- my $herectx = $here . "\n";
- for (my $n = 0; $n < $cnt; $n++) {
- $herectx .= raw_line($linenr, $n) . "\n";
- }
- return $herectx;
- }
- sub cat_vet {
- my ($vet) = @_;
- my ($res, $coded);
- $res = '';
- while ($vet =~ /([^[:cntrl:]]*)([[:cntrl:]]|$)/g) {
- $res .= $1;
- if ($2 ne '') {
- $coded = sprintf("^%c", unpack('C', $2) + 64);
- $res .= $coded;
- }
- }
- $res =~ s/$/\$/;
- return $res;
- }
- my $av_preprocessor = 0;
- my $av_pending;
- my @av_paren_type;
- my $av_pend_colon;
- sub annotate_reset {
- $av_preprocessor = 0;
- $av_pending = '_';
- @av_paren_type = ('E');
- $av_pend_colon = 'O';
- }
- sub annotate_values {
- my ($stream, $type) = @_;
- my $res;
- my $var = '_' x length($stream);
- my $cur = $stream;
- print "$stream\n" if ($dbg_values > 1);
- while (length($cur)) {
- @av_paren_type = ('E') if ($#av_paren_type < 0);
- print " <" . join('', @av_paren_type) .
- "> <$type> <$av_pending>" if ($dbg_values > 1);
- if ($cur =~ /^(\s+)/o) {
- print "WS($1)\n" if ($dbg_values > 1);
- if ($1 =~ /\n/ && $av_preprocessor) {
- $type = pop(@av_paren_type);
- $av_preprocessor = 0;
- }
- } elsif ($cur =~ /^(\(\s*$Type\s*)\)/ && $av_pending eq '_') {
- print "CAST($1)\n" if ($dbg_values > 1);
- push(@av_paren_type, $type);
- $type = 'c';
- } elsif ($cur =~ /^($Type)\s*(?:$Ident|,|\)|\(|\s*$)/) {
- print "DECLARE($1)\n" if ($dbg_values > 1);
- $type = 'T';
- } elsif ($cur =~ /^($Modifier)\s*/) {
- print "MODIFIER($1)\n" if ($dbg_values > 1);
- $type = 'T';
- } elsif ($cur =~ /^(\#\s*define\s*$Ident)(\(?)/o) {
- print "DEFINE($1,$2)\n" if ($dbg_values > 1);
- $av_preprocessor = 1;
- push(@av_paren_type, $type);
- if ($2 ne '') {
- $av_pending = 'N';
- }
- $type = 'E';
- } elsif ($cur =~ /^(\#\s*(?:undef\s*$Ident|include\b))/o) {
- print "UNDEF($1)\n" if ($dbg_values > 1);
- $av_preprocessor = 1;
- push(@av_paren_type, $type);
- } elsif ($cur =~ /^(\#\s*(?:ifdef|ifndef|if))/o) {
- print "PRE_START($1)\n" if ($dbg_values > 1);
- $av_preprocessor = 1;
- push(@av_paren_type, $type);
- push(@av_paren_type, $type);
- $type = 'E';
- } elsif ($cur =~ /^(\#\s*(?:else|elif))/o) {
- print "PRE_RESTART($1)\n" if ($dbg_values > 1);
- $av_preprocessor = 1;
- push(@av_paren_type, $av_paren_type[$#av_paren_type]);
- $type = 'E';
- } elsif ($cur =~ /^(\#\s*(?:endif))/o) {
- print "PRE_END($1)\n" if ($dbg_values > 1);
- $av_preprocessor = 1;
-
-
- pop(@av_paren_type);
- push(@av_paren_type, $type);
- $type = 'E';
- } elsif ($cur =~ /^(\\\n)/o) {
- print "PRECONT($1)\n" if ($dbg_values > 1);
- } elsif ($cur =~ /^(__attribute__)\s*\(?/o) {
- print "ATTR($1)\n" if ($dbg_values > 1);
- $av_pending = $type;
- $type = 'N';
- } elsif ($cur =~ /^(sizeof)\s*(\()?/o) {
- print "SIZEOF($1)\n" if ($dbg_values > 1);
- if (defined $2) {
- $av_pending = 'V';
- }
- $type = 'N';
- } elsif ($cur =~ /^(if|while|for)\b/o) {
- print "COND($1)\n" if ($dbg_values > 1);
- $av_pending = 'E';
- $type = 'N';
- } elsif ($cur =~/^(case)/o) {
- print "CASE($1)\n" if ($dbg_values > 1);
- $av_pend_colon = 'C';
- $type = 'N';
- } elsif ($cur =~/^(return|else|goto|typeof|__typeof__)\b/o) {
- print "KEYWORD($1)\n" if ($dbg_values > 1);
- $type = 'N';
- } elsif ($cur =~ /^(\()/o) {
- print "PAREN('$1')\n" if ($dbg_values > 1);
- push(@av_paren_type, $av_pending);
- $av_pending = '_';
- $type = 'N';
- } elsif ($cur =~ /^(\))/o) {
- my $new_type = pop(@av_paren_type);
- if ($new_type ne '_') {
- $type = $new_type;
- print "PAREN('$1') -> $type\n"
- if ($dbg_values > 1);
- } else {
- print "PAREN('$1')\n" if ($dbg_values > 1);
- }
- } elsif ($cur =~ /^($Ident)\s*\(/o) {
- print "FUNC($1)\n" if ($dbg_values > 1);
- $type = 'V';
- $av_pending = 'V';
- } elsif ($cur =~ /^($Ident\s*):(?:\s*\d+\s*(,|=|;))?/) {
- if (defined $2 && $type eq 'C' || $type eq 'T') {
- $av_pend_colon = 'B';
- } elsif ($type eq 'E') {
- $av_pend_colon = 'L';
- }
- print "IDENT_COLON($1,$type>$av_pend_colon)\n" if ($dbg_values > 1);
- $type = 'V';
- } elsif ($cur =~ /^($Ident|$Constant)/o) {
- print "IDENT($1)\n" if ($dbg_values > 1);
- $type = 'V';
- } elsif ($cur =~ /^($Assignment)/o) {
- print "ASSIGN($1)\n" if ($dbg_values > 1);
- $type = 'N';
- } elsif ($cur =~/^(;|{|})/) {
- print "END($1)\n" if ($dbg_values > 1);
- $type = 'E';
- $av_pend_colon = 'O';
- } elsif ($cur =~/^(,)/) {
- print "COMMA($1)\n" if ($dbg_values > 1);
- $type = 'C';
- } elsif ($cur =~ /^(\?)/o) {
- print "QUESTION($1)\n" if ($dbg_values > 1);
- $type = 'N';
- } elsif ($cur =~ /^(:)/o) {
- print "COLON($1,$av_pend_colon)\n" if ($dbg_values > 1);
- substr($var, length($res), 1, $av_pend_colon);
- if ($av_pend_colon eq 'C' || $av_pend_colon eq 'L') {
- $type = 'E';
- } else {
- $type = 'N';
- }
- $av_pend_colon = 'O';
- } elsif ($cur =~ /^(\[)/o) {
- print "CLOSE($1)\n" if ($dbg_values > 1);
- $type = 'N';
- } elsif ($cur =~ /^(-(?![->])|\+(?!\+)|\*|\&\&|\&)/o) {
- my $variant;
- print "OPV($1)\n" if ($dbg_values > 1);
- if ($type eq 'V') {
- $variant = 'B';
- } else {
- $variant = 'U';
- }
- substr($var, length($res), 1, $variant);
- $type = 'N';
- } elsif ($cur =~ /^($Operators)/o) {
- print "OP($1)\n" if ($dbg_values > 1);
- if ($1 ne '++' && $1 ne '--') {
- $type = 'N';
- }
- } elsif ($cur =~ /(^.)/o) {
- print "C($1)\n" if ($dbg_values > 1);
- }
- if (defined $1) {
- $cur = substr($cur, length($1));
- $res .= $type x length($1);
- }
- }
- return ($res, $var);
- }
- sub possible {
- my ($possible, $line) = @_;
- my $notPermitted = qr{(?:
- ^(?:
- $Modifier|
- $Storage|
- $Type|
- DEFINE_\S+
- )$|
- ^(?:
- goto|
- return|
- case|
- else|
- asm|__asm__|
- do|
- \#|
- \#\#|
- )(?:\s|$)|
- ^(?:typedef|struct|enum)\b
- )}x;
- warn "CHECK<$possible> ($line)\n" if ($dbg_possible > 2);
- if ($possible !~ $notPermitted) {
-
- $possible =~ s/\s*$Storage\s*//g;
- $possible =~ s/\s*$Sparse\s*//g;
- if ($possible =~ /^\s*$/) {
- } elsif ($possible =~ /\s/) {
- $possible =~ s/\s*$Type\s*//g;
- for my $modifier (split(' ', $possible)) {
- if ($modifier !~ $notPermitted) {
- warn "MODIFIER: $modifier ($possible) ($line)\n" if ($dbg_possible);
- push(@modifierListFile, $modifier);
- }
- }
- } else {
- warn "POSSIBLE: $possible ($line)\n" if ($dbg_possible);
- push(@typeListFile, $possible);
- }
- build_types();
- } else {
- warn "NOTPOSS: $possible ($line)\n" if ($dbg_possible > 1);
- }
- }
- my $prefix = '';
- sub show_type {
- my ($type) = @_;
- $type =~ tr/[a-z]/[A-Z]/;
- return defined $use_type{$type} if (scalar keys %use_type > 0);
- return !defined $ignore_type{$type};
- }
- sub report {
- my ($level, $type, $msg) = @_;
- if (!show_type($type) ||
- (defined $tst_only && $msg !~ /\Q$tst_only\E/)) {
- return 0;
- }
- my $output = '';
- if ($color) {
- if ($level eq 'ERROR') {
- $output .= RED;
- } elsif ($level eq 'WARNING') {
- $output .= YELLOW;
- } else {
- $output .= GREEN;
- }
- }
- $output .= $prefix . $level . ':';
- if ($show_types) {
- $output .= BLUE if ($color);
- $output .= "$type:";
- }
- $output .= RESET if ($color);
- $output .= ' ' . $msg . "\n";
- if ($showfile) {
- my @lines = split("\n", $output, -1);
- splice(@lines, 1, 1);
- $output = join("\n", @lines);
- }
- $output = (split('\n', $output))[0] . "\n" if ($terse);
- push(our @report, $output);
- return 1;
- }
- sub report_dump {
- our @report;
- }
- sub fixup_current_range {
- my ($lineRef, $offset, $length) = @_;
- if ($$lineRef =~ /^\@\@ -\d+,\d+ \+(\d+),(\d+) \@\@/) {
- my $o = $1;
- my $l = $2;
- my $no = $o + $offset;
- my $nl = $l + $length;
- $$lineRef =~ s/\+$o,$l \@\@/\+$no,$nl \@\@/;
- }
- }
- sub fix_inserted_deleted_lines {
- my ($linesRef, $insertedRef, $deletedRef) = @_;
- my $range_last_linenr = 0;
- my $delta_offset = 0;
- my $old_linenr = 0;
- my $new_linenr = 0;
- my $next_insert = 0;
- my $next_delete = 0;
- my @lines = ();
- my $inserted = @{$insertedRef}[$next_insert++];
- my $deleted = @{$deletedRef}[$next_delete++];
- foreach my $old_line (@{$linesRef}) {
- my $save_line = 1;
- my $line = $old_line;
- if ($line =~ /^(?:\+\+\+|\-\-\-)\s+\S+/) {
- $delta_offset = 0;
- } elsif ($line =~ /^\@\@ -\d+,\d+ \+\d+,\d+ \@\@/) {
- $range_last_linenr = $new_linenr;
- fixup_current_range(\$line, $delta_offset, 0);
- }
- while (defined($deleted) && ${$deleted}{'LINENR'} == $old_linenr) {
- $deleted = @{$deletedRef}[$next_delete++];
- $save_line = 0;
- fixup_current_range(\$lines[$range_last_linenr], $delta_offset--, -1);
- }
- while (defined($inserted) && ${$inserted}{'LINENR'} == $old_linenr) {
- push(@lines, ${$inserted}{'LINE'});
- $inserted = @{$insertedRef}[$next_insert++];
- $new_linenr++;
- fixup_current_range(\$lines[$range_last_linenr], $delta_offset++, 1);
- }
- if ($save_line) {
- push(@lines, $line);
- $new_linenr++;
- }
- $old_linenr++;
- }
- return @lines;
- }
- sub fix_insert_line {
- my ($linenr, $line) = @_;
- my $inserted = {
- LINENR => $linenr,
- LINE => $line,
- };
- push(@fixed_inserted, $inserted);
- }
- sub fix_delete_line {
- my ($linenr, $line) = @_;
- my $deleted = {
- LINENR => $linenr,
- LINE => $line,
- };
- push(@fixed_deleted, $deleted);
- }
- sub ERROR {
- my ($type, $msg) = @_;
- if (report("ERROR", $type, $msg)) {
- our $clean = 0;
- our $cnt_error++;
- return 1;
- }
- return 0;
- }
- sub WARN {
- my ($type, $msg) = @_;
- if (report("WARNING", $type, $msg)) {
- our $clean = 0;
- our $cnt_warn++;
- return 1;
- }
- return 0;
- }
- sub CHK {
- my ($type, $msg) = @_;
- if ($check && report("CHECK", $type, $msg)) {
- our $clean = 0;
- our $cnt_chk++;
- return 1;
- }
- return 0;
- }
- sub check_absolute_file {
- my ($absolute, $herecurr) = @_;
- my $file = $absolute;
-
-
- while ($file =~ s@^[^/]*/@@) {
- if (-f "$root/$file") {
-
- last;
- }
- }
- if (! -f _) {
- return 0;
- }
-
- my $prefix = $absolute;
- substr($prefix, -length($file)) = '';
-
- if ($prefix ne ".../") {
- WARN("USE_RELATIVE_PATH",
- "use relative pathname instead of absolute in changelog text\n" . $herecurr);
- }
- }
- sub trim {
- my ($string) = @_;
- $string =~ s/^\s+|\s+$//g;
- return $string;
- }
- sub ltrim {
- my ($string) = @_;
- $string =~ s/^\s+//;
- return $string;
- }
- sub rtrim {
- my ($string) = @_;
- $string =~ s/\s+$//;
- return $string;
- }
- sub string_find_replace {
- my ($string, $find, $replace) = @_;
- $string =~ s/$find/$replace/g;
- return $string;
- }
- sub tabify {
- my ($leading) = @_;
- my $source_indent = $tabsize;
- my $max_spaces_before_tab = $source_indent - 1;
- my $spaces_to_tab = " " x $source_indent;
-
- 1 while $leading =~ s@^([\t]*)$spaces_to_tab@$1\t@g;
-
- 1 while $leading =~ s@^([\t]*)( {1,$max_spaces_before_tab})\t@$1\t@g;
- return "$leading";
- }
- sub pos_last_openparen {
- my ($line) = @_;
- my $pos = 0;
- my $opens = $line =~ tr/\(/\(/;
- my $closes = $line =~ tr/\)/\)/;
- my $last_openparen = 0;
- if (($opens == 0) || ($closes >= $opens)) {
- return -1;
- }
- my $len = length($line);
- for ($pos = 0; $pos < $len; $pos++) {
- my $string = substr($line, $pos);
- if ($string =~ /^($FuncArg|$balanced_parens)/) {
- $pos += length($1) - 1;
- } elsif (substr($line, $pos, 1) eq '(') {
- $last_openparen = $pos;
- } elsif (index($string, '(') == -1) {
- last;
- }
- }
- return length(expand_tabs(substr($line, 0, $last_openparen))) + 1;
- }
- sub process {
- my $filename = shift;
- my $linenr=0;
- my $prevline="";
- my $prevrawline="";
- my $stashline="";
- my $stashrawline="";
- my $length;
- my $indent;
- my $previndent=0;
- my $stashindent=0;
- our $clean = 1;
- my $signoff = 0;
- my $author = '';
- my $authorsignoff = 0;
- my $is_patch = 0;
- my $is_binding_patch = -1;
- my $in_header_lines = $file ? 0 : 1;
- my $in_commit_log = 0;
- my $has_patch_separator = 0;
- my $has_commit_log = 0;
- my $commit_log_lines = 0;
- my $commit_log_possible_stack_dump = 0;
- my $commit_log_long_line = 0;
- my $commit_log_has_diff = 0;
- my $reported_maintainer_file = 0;
- my $non_utf8_charset = 0;
- my $last_blank_line = 0;
- my $last_coalesced_string_linenr = -1;
- our @report = ();
- our $cnt_lines = 0;
- our $cnt_error = 0;
- our $cnt_warn = 0;
- our $cnt_chk = 0;
-
- my $realfile = '';
- my $realline = 0;
- my $realcnt = 0;
- my $here = '';
- my $context_function;
- my $in_comment = 0;
- my $comment_edge = 0;
- my $first_line = 0;
- my $p1_prefix = '';
- my $prev_values = 'E';
-
- my %suppress_ifbraces;
- my %suppress_whiletrailers;
- my %suppress_export;
- my $suppress_statement = 0;
- my %signatures = ();
-
-
-
- my @setup_docs = ();
- my $setup_docs = 0;
- my $camelcase_file_seeded = 0;
- my $checklicenseline = 1;
- sanitise_line_reset();
- my $line;
- foreach my $rawline (@rawlines) {
- $linenr++;
- $line = $rawline;
- push(@fixed, $rawline) if ($fix);
- if ($rawline=~/^\+\+\+\s+(\S+)/) {
- $setup_docs = 0;
- if ($1 =~ m@Documentation/admin-guide/kernel-parameters.txt$@) {
- $setup_docs = 1;
- }
-
- }
- if ($rawline =~ /^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@/) {
- $realline=$1-1;
- if (defined $2) {
- $realcnt=$3+1;
- } else {
- $realcnt=1+1;
- }
- $in_comment = 0;
-
-
-
-
- my $edge;
- my $cnt = $realcnt;
- for (my $ln = $linenr + 1; $cnt > 0; $ln++) {
- next if (defined $rawlines[$ln - 1] &&
- $rawlines[$ln - 1] =~ /^-/);
- $cnt--;
-
- last if (!defined $rawlines[$ln - 1]);
- if ($rawlines[$ln - 1] =~ m@(/\*|\*/)@ &&
- $rawlines[$ln - 1] !~ m@"[^"]*(?:/\*|\*/)[^"]*"@) {
- ($edge) = $1;
- last;
- }
- }
- if (defined $edge && $edge eq '*/') {
- $in_comment = 1;
- }
- # Guestimate if this is a continuing comment. If this
- # is the start of a diff block and this line starts
- # ' *' then it is very likely a comment.
- if (!defined $edge &&
- $rawlines[$linenr] =~ m@^.\s*(?:\*\*+| \*)(?:\s|$)@)
- {
- $in_comment = 1;
- }
- ##print "COMMENT:$in_comment edge<$edge> $rawline\n";
- sanitise_line_reset($in_comment);
- } elsif ($realcnt && $rawline =~ /^(?:\+| |$)/) {
- # Standardise the strings and chars within the input to
- # simplify matching -- only bother with positive lines.
- $line = sanitise_line($rawline);
- }
- push(@lines, $line);
- if ($realcnt > 1) {
- $realcnt-- if ($line =~ /^(?:\+| |$)/);
- } else {
- $realcnt = 0;
- }
- #print "==>$rawline\n";
- #print "-->$line\n";
- if ($setup_docs && $line =~ /^\+/) {
- push(@setup_docs, $line);
- }
- }
- $prefix = '';
- $realcnt = 0;
- $linenr = 0;
- $fixlinenr = -1;
- foreach my $line (@lines) {
- $linenr++;
- $fixlinenr++;
- my $sline = $line; #copy of $line
- $sline =~ s/$;/ /g; #with comments as spaces
- my $rawline = $rawlines[$linenr - 1];
- # check if it's a mode change, rename or start of a patch
- if (!$in_commit_log &&
- ($line =~ /^ mode change [0-7]+ => [0-7]+ \S+\s*$/ ||
- ($line =~ /^rename (?:from|to) \S+\s*$/ ||
- $line =~ /^diff --git a\/[\w\/\.\_\-]+ b\/\S+\s*$/))) {
- $is_patch = 1;
- }
- if (!$in_commit_log &&
- $line =~ /^\@\@ -\d+(?:,\d+)? \+(\d+)(,(\d+))? \@\@(.*)/) {
- my $context = $4;
- $is_patch = 1;
- $first_line = $linenr + 1;
- $realline=$1-1;
- if (defined $2) {
- $realcnt=$3+1;
- } else {
- $realcnt=1+1;
- }
- annotate_reset();
- $prev_values = 'E';
- %suppress_ifbraces = ();
- %suppress_whiletrailers = ();
- %suppress_export = ();
- $suppress_statement = 0;
- if ($context =~ /\b(\w+)\s*\(/) {
- $context_function = $1;
- } else {
- undef $context_function;
- }
- next;
- } elsif ($line =~ /^( |\+|$)/) {
- $realline++;
- $realcnt-- if ($realcnt != 0);
-
- ($length, $indent) = line_stats($rawline);
-
- ($prevline, $stashline) = ($stashline, $line);
- ($previndent, $stashindent) = ($stashindent, $indent);
- ($prevrawline, $stashrawline) = ($stashrawline, $rawline);
-
- } elsif ($realcnt == 1) {
- $realcnt--;
- }
- my $hunk_line = ($realcnt != 0);
- $here = "#$linenr: " if (!$file);
- $here = "#$realline: " if ($file);
- my $found_file = 0;
-
- if ($line =~ /^diff --git.*?(\S+)$/) {
- $realfile = $1;
- $realfile =~ s@^([^/]*)/@@ if (!$file);
- $in_commit_log = 0;
- $found_file = 1;
- } elsif ($line =~ /^\+\+\+\s+(\S+)/) {
- $realfile = $1;
- $realfile =~ s@^([^/]*)/@@ if (!$file);
- $in_commit_log = 0;
- $p1_prefix = $1;
- if (!$file && $tree && $p1_prefix ne '' &&
- -e "$root/$p1_prefix") {
- WARN("PATCH_PREFIX",
- "patch prefix '$p1_prefix' exists, appears to be a -p0 patch\n");
- }
- if ($realfile =~ m@^include/asm/@) {
- ERROR("MODIFIED_INCLUDE_ASM",
- "do not modify files in include/asm, change architecture specific files in include/asm-<architecture>\n" . "$here$rawline\n");
- }
- $found_file = 1;
- }
- my $skipme = 0;
- foreach (@exclude) {
- if ($realfile =~ m@^(?:$_/)@) {
- $skipme = 1;
- }
- }
- if ($skipme) {
- next;
- }
- if ($showfile) {
- $prefix = "$realfile:$realline: "
- } elsif ($emacs) {
- if ($file) {
- $prefix = "$filename:$realline: ";
- } else {
- $prefix = "$filename:$linenr: ";
- }
- }
- if ($found_file) {
- if (is_maintained_obsolete($realfile)) {
- WARN("OBSOLETE",
- "$realfile is marked as 'obsolete' in the MAINTAINERS hierarchy. No unnecessary modifications please.\n");
- }
- if ($realfile =~ m@^(?:drivers/net/|net/|drivers/staging/)@) {
- $check = 1;
- } else {
- $check = $check_orig;
- }
- $checklicenseline = 1;
- if ($realfile !~ /^MAINTAINERS/) {
- my $last_binding_patch = $is_binding_patch;
- $is_binding_patch = () = $realfile =~ m@^(?:Documentation/devicetree/|include/dt-bindings/)@;
- if (($last_binding_patch != -1) &&
- ($last_binding_patch ^ $is_binding_patch)) {
- WARN("DT_SPLIT_BINDING_PATCH",
- "DT binding docs and includes should be a separate patch. See: Documentation/devicetree/bindings/submitting-patches.rst\n");
- }
- }
- next;
- }
- $here .= "FILE: $realfile:$realline:" if ($realcnt != 0);
- my $hereline = "$here\n$rawline\n";
- my $herecurr = "$here\n$rawline\n";
- my $hereprev = "$here\n$prevrawline\n$rawline\n";
- $cnt_lines++ if ($realcnt != 0);
- if ($in_commit_log) {
- if ($line !~ /^\s*$/) {
- $commit_log_lines++;
- }
- } elsif ($has_commit_log && $commit_log_lines < 2) {
- WARN("COMMIT_MESSAGE",
- "Missing commit description - Add an appropriate one\n");
- $commit_log_lines = 2;
- }
- if ($in_commit_log && !$commit_log_has_diff &&
- (($line =~ m@^\s+diff\b.*a/[\w/]+@ &&
- $line =~ m@^\s+diff\b.*a/([\w/]+)\s+b/$1\b@) ||
- $line =~ m@^\s*(?:\-\-\-\s+a/|\+\+\+\s+b/)@ ||
- $line =~ m/^\s*\@\@ \-\d+,\d+ \+\d+,\d+ \@\@/)) {
- ERROR("DIFF_IN_COMMIT_MSG",
- "Avoid using diff content in the commit message - patch(1) might not work\n" . $herecurr);
- $commit_log_has_diff = 1;
- }
- if ($line =~ /^new (file )?mode.*[7531]\d{0,2}$/) {
- my $permhere = $here . "FILE: $realfile\n";
- if ($realfile !~ m@scripts/@ &&
- $realfile !~ /\.(py|pl|awk|sh)$/) {
- ERROR("EXECUTE_PERMISSIONS",
- "do not set execute permissions for source files\n" . $permhere);
- }
- }
- if (decode("MIME-Header", $line) =~ /^From:\s*(.*)/) {
- $author = $1;
- $author = encode("utf8", $author) if ($line =~ /=\?utf-8\?/i);
- $author =~ s/"//g;
- }
- if ($line =~ /^\s*signed-off-by:/i) {
- $signoff++;
- $in_commit_log = 0;
- if ($author ne '') {
- my $l = $line;
- $l =~ s/"//g;
- if ($l =~ /^\s*signed-off-by:\s*\Q$author\E/i) {
- $authorsignoff = 1;
- }
- }
- }
- if ($line =~ /^---$/) {
- $has_patch_separator = 1;
- $in_commit_log = 0;
- }
- if ($line =~ /^\s*CODEOWNERS\s*\|/) {
- $reported_maintainer_file = 1;
- }
- if (!$in_header_lines &&
- $line =~ /^(\s*)([a-z0-9_-]+by:|$signature_tags)(\s*)(.*)/i) {
- my $space_before = $1;
- my $sign_off = $2;
- my $space_after = $3;
- my $email = $4;
- my $ucfirst_sign_off = ucfirst(lc($sign_off));
- if ($sign_off !~ /$signature_tags/) {
- WARN("BAD_SIGN_OFF",
- "Non-standard signature: $sign_off\n" . $herecurr);
- }
- if (defined $space_before && $space_before ne "") {
- if (WARN("BAD_SIGN_OFF",
- "Do not use whitespace before $ucfirst_sign_off\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =
- "$ucfirst_sign_off $email";
- }
- }
- if ($sign_off =~ /-by:$/i && $sign_off ne $ucfirst_sign_off) {
- if (WARN("BAD_SIGN_OFF",
- "'$ucfirst_sign_off' is the preferred signature form\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =
- "$ucfirst_sign_off $email";
- }
- }
- if (!defined $space_after || $space_after ne " ") {
- if (WARN("BAD_SIGN_OFF",
- "Use a single space after $ucfirst_sign_off\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =
- "$ucfirst_sign_off $email";
- }
- }
- my ($email_name, $email_address, $comment) = parse_email($email);
- my $suggested_email = format_email(($email_name, $email_address));
- if ($suggested_email eq "") {
- ERROR("BAD_SIGN_OFF",
- "Unrecognized email address: '$email'\n" . $herecurr);
- } else {
- my $dequoted = $suggested_email;
- $dequoted =~ s/^"//;
- $dequoted =~ s/" </ </;
-
-
- if ("$dequoted$comment" ne $email &&
- "<$email_address>$comment" ne $email &&
- "$suggested_email$comment" ne $email) {
- WARN("BAD_SIGN_OFF",
- "email address '$email' might be better as '$suggested_email$comment'\n" . $herecurr);
- }
- }
- my $sig_nospace = $line;
- $sig_nospace =~ s/\s//g;
- $sig_nospace = lc($sig_nospace);
- if (defined $signatures{$sig_nospace}) {
- WARN("BAD_SIGN_OFF",
- "Duplicate signature\n" . $herecurr);
- } else {
- $signatures{$sig_nospace} = 1;
- }
- if ($sign_off =~ /^co-developed-by:$/i) {
- if ($email eq $author) {
- WARN("BAD_SIGN_OFF",
- "Co-developed-by: should not be used to attribute nominal patch author '$author'\n" . "$here\n" . $rawline);
- }
- if (!defined $lines[$linenr]) {
- WARN("BAD_SIGN_OFF",
- "Co-developed-by: must be immediately followed by Signed-off-by:\n" . "$here\n" . $rawline);
- } elsif ($rawlines[$linenr] !~ /^\s*signed-off-by:\s*(.*)/i) {
- WARN("BAD_SIGN_OFF",
- "Co-developed-by: must be immediately followed by Signed-off-by:\n" . "$here\n" . $rawline . "\n" .$rawlines[$linenr]);
- } elsif ($1 ne $email) {
- WARN("BAD_SIGN_OFF",
- "Co-developed-by and Signed-off-by: name/email do not match \n" . "$here\n" . $rawline . "\n" .$rawlines[$linenr]);
- }
- }
- }
- if ($in_header_lines &&
- $line =~ /^Subject:.*\b(?:checkpatch|sparse|smatch)\b[^:]/i) {
- WARN("EMAIL_SUBJECT",
- "A patch subject line should describe the change not the tool that found it\n" . $herecurr);
- }
- if ($realfile eq '' && !$has_patch_separator && $line =~ /^\s*change-id:/i) {
- ERROR("GERRIT_CHANGE_ID",
- "Remove Gerrit Change-Id's before submitting upstream\n" . $herecurr);
- }
- if ($in_commit_log && !$commit_log_possible_stack_dump &&
- ($line =~ /^\s*(?:WARNING:|BUG:)/ ||
- $line =~ /^\s*\[\s*\d+\.\d{6,6}\s*\]/ ||
-
- $line =~ /^\s*\[\<[0-9a-fA-F]{8,}\>\]/) ||
- $line =~ /^(?:\s+\w+:\s+[0-9a-fA-F]+){3,3}/ ||
- $line =~ /^\s*\#\d+\s*\[[0-9a-fA-F]+\]\s*\w+ at [0-9a-fA-F]+/) {
-
- $commit_log_possible_stack_dump = 1;
- }
- if ($in_commit_log && !$commit_log_long_line &&
- length($line) > 75 &&
- !($line =~ /^\s*[a-zA-Z0-9_\/\.]+\s+\|\s+\d+/ ||
-
- $line =~ /^\s*(?:[\w\.\-]+\/)++[\w\.\-]+:/ ||
-
- $line =~ /^\s*(?:Fixes:|Link:)/i ||
-
- $commit_log_possible_stack_dump)) {
- WARN("COMMIT_LOG_LONG_LINE",
- "Possible unwrapped commit description (prefer a maximum 75 chars per line)\n" . $herecurr);
- $commit_log_long_line = 1;
- }
- if ($in_commit_log && $commit_log_possible_stack_dump &&
- $line =~ /^\s*$/) {
- $commit_log_possible_stack_dump = 0;
- }
- if ($in_commit_log && !$commit_log_possible_stack_dump &&
- $line !~ /^\s*(?:Link|Patchwork|http|https|BugLink|base-commit):/i &&
- $line !~ /^This reverts commit [0-9a-f]{7,40}/ &&
- ($line =~ /\bcommit\s+[0-9a-f]{5,}\b/i ||
- ($line =~ /(?:\s|^)[0-9a-f]{12,40}(?:[\s"'\(\[]|$)/i &&
- $line !~ /[\<\[][0-9a-f]{12,40}[\>\]]/i &&
- $line !~ /\bfixes:\s*[0-9a-f]{12,40}/i))) {
- my $init_char = "c";
- my $orig_commit = "";
- my $short = 1;
- my $long = 0;
- my $case = 1;
- my $space = 1;
- my $hasdesc = 0;
- my $hasparens = 0;
- my $id = '0123456789ab';
- my $orig_desc = "commit description";
- my $description = "";
- if ($line =~ /\b(c)ommit\s+([0-9a-f]{5,})\b/i) {
- $init_char = $1;
- $orig_commit = lc($2);
- } elsif ($line =~ /\b([0-9a-f]{12,40})\b/i) {
- $orig_commit = lc($1);
- }
- $short = 0 if ($line =~ /\bcommit\s+[0-9a-f]{12,40}/i);
- $long = 1 if ($line =~ /\bcommit\s+[0-9a-f]{41,}/i);
- $space = 0 if ($line =~ /\bcommit [0-9a-f]/i);
- $case = 0 if ($line =~ /\b[Cc]ommit\s+[0-9a-f]{5,40}[^A-F]/);
- if ($line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("([^"]+)"\)/i) {
- $orig_desc = $1;
- $hasparens = 1;
- } elsif ($line =~ /\bcommit\s+[0-9a-f]{5,}\s*$/i &&
- defined $rawlines[$linenr] &&
- $rawlines[$linenr] =~ /^\s*\("([^"]+)"\)/) {
- $orig_desc = $1;
- $hasparens = 1;
- } elsif ($line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("[^"]+$/i &&
- defined $rawlines[$linenr] &&
- $rawlines[$linenr] =~ /^\s*[^"]+"\)/) {
- $line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("([^"]+)$/i;
- $orig_desc = $1;
- $rawlines[$linenr] =~ /^\s*([^"]+)"\)/;
- $orig_desc .= " " . $1;
- $hasparens = 1;
- }
- ($id, $description) = git_commit_info($orig_commit,
- $id, $orig_desc);
- if (defined($id) &&
- ($short || $long || $space || $case || ($orig_desc ne $description) || !$hasparens)) {
- ERROR("GIT_COMMIT_ID",
- "Please use git commit description style 'commit <12+ chars of sha1> (\"<title line>\")' - ie: '${init_char}ommit $id (\"$description\")'\n" . $herecurr);
- }
- }
- if (!$reported_maintainer_file && !$in_commit_log &&
- ($line =~ /^(?:new|deleted) file mode\s*\d+\s*$/ ||
- $line =~ /^rename (?:from|to) [\w\/\.\-]+\s*$/ ||
- ($line =~ /\{\s*([\w\/\.\-]*)\s*\=\>\s*([\w\/\.\-]*)\s*\}/ &&
- (defined($1) || defined($2))))) {
- $is_patch = 1;
- $reported_maintainer_file = 1;
- WARN("FILE_PATH_CHANGES",
- "added, moved or deleted file(s), does CODEOWNERS need updating?\n" . $herecurr);
- }
- if (!$in_commit_log &&
- ($line =~ /^new file mode\s*\d+\s*$/) &&
- ($realfile =~ m@^Documentation/devicetree/bindings/.*\.txt$@)) {
- WARN("DT_SCHEMA_BINDING_PATCH",
- "DT bindings should be in DT schema format. See: Documentation/devicetree/writing-schema.rst\n");
- }
- if ($realcnt != 0 && $line !~ m{^(?:\+|-| |\\ No newline|$)}) {
- ERROR("CORRUPTED_PATCH",
- "patch seems to be corrupt (line wrapped?)\n" .
- $herecurr) if (!$emitted_corrupt++);
- }
- if (($realfile =~ /^$/ || $line =~ /^\+/) &&
- $rawline !~ m/^$UTF8*$/) {
- my ($utf8_prefix) = ($rawline =~ /^($UTF8*)/);
- my $blank = copy_spacing($rawline);
- my $ptr = substr($blank, 0, length($utf8_prefix)) . "^";
- my $hereptr = "$hereline$ptr\n";
- CHK("INVALID_UTF8",
- "Invalid UTF-8, patch and commit message should be encoded in UTF-8\n" . $hereptr);
- }
- if ($in_header_lines && $realfile =~ /^$/ &&
- !($rawline =~ /^\s+(?:\S|$)/ ||
- $rawline =~ /^(?:commit\b|from\b|[\w-]+:)/i)) {
- $in_header_lines = 0;
- $in_commit_log = 1;
- $has_commit_log = 1;
- }
- if ($in_header_lines &&
- $rawline =~ /^Content-Type:.+charset="(.+)".*$/ &&
- $1 !~ /utf-8/i) {
- $non_utf8_charset = 1;
- }
- if ($in_commit_log && $non_utf8_charset && $realfile =~ /^$/ &&
- $rawline =~ /$NON_ASCII_UTF8/) {
- WARN("UTF8_BEFORE_PATCH",
- "8-bit UTF-8 used in possible commit log\n" . $herecurr);
- }
- if ($tree && $in_commit_log) {
- while ($line =~ m{(?:^|\s)(/\S*)}g) {
- my $file = $1;
- if ($file =~ m{^(.*?)(?::\d+)+:?$} &&
- check_absolute_file($1, $herecurr)) {
- #
- } else {
- check_absolute_file($file, $herecurr);
- }
- }
- }
- # Check for various typo / spelling mistakes
- if (defined($misspellings) &&
- ($in_commit_log || $line =~ /^(?:\+|Subject:)/i)) {
- while ($rawline =~ /(?:^|[^a-z@])($misspellings)(?:\b|$|[^a-z@])/gi) {
- my $typo = $1;
- my $typo_fix = $spelling_fix{lc($typo)};
- $typo_fix = ucfirst($typo_fix) if ($typo =~ /^[A-Z]/);
- $typo_fix = uc($typo_fix) if ($typo =~ /^[A-Z]+$/);
- my $msg_level = \&WARN;
- $msg_level = \&CHK if ($file);
- if (&{$msg_level}("TYPO_SPELLING",
- "'$typo' may be misspelled - perhaps '$typo_fix'?\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~ s/(^|[^A-Za-z@])($typo)($|[^A-Za-z@])/$1$typo_fix$3/;
- }
- }
- }
- if ($in_commit_log && $line =~ /(^fixes:|\bcommit)\s+([0-9a-f]{6,40})\b/i) {
- my $id;
- my $description;
- ($id, $description) = git_commit_info($2, undef, undef);
- if (!defined($id)) {
- WARN("UNKNOWN_COMMIT_ID",
- "Unknown commit id '$2', maybe rebased or not pulled?\n" . $herecurr);
- }
- }
- next if (!$hunk_line || $line =~ /^-/);
- if ($line =~ /^\+.*\015/) {
- my $herevet = "$here\n" . cat_vet($rawline) . "\n";
- if (ERROR("DOS_LINE_ENDINGS",
- "DOS line endings\n" . $herevet) &&
- $fix) {
- $fixed[$fixlinenr] =~ s/[\s\015]+$//;
- }
- } elsif ($rawline =~ /^\+.*\S\s+$/ || $rawline =~ /^\+\s+$/) {
- my $herevet = "$here\n" . cat_vet($rawline) . "\n";
- if (ERROR("TRAILING_WHITESPACE",
- "trailing whitespace\n" . $herevet) &&
- $fix) {
- $fixed[$fixlinenr] =~ s/\s+$//;
- }
- $rpt_cleaners = 1;
- }
- if ($rawline =~ /\bwrite to the Free/i ||
- $rawline =~ /\b675\s+Mass\s+Ave/i ||
- $rawline =~ /\b59\s+Temple\s+Pl/i ||
- $rawline =~ /\b51\s+Franklin\s+St/i) {
- my $herevet = "$here\n" . cat_vet($rawline) . "\n";
- my $msg_level = \&ERROR;
- $msg_level = \&CHK if ($file);
- &{$msg_level}("FSF_MAILING_ADDRESS",
- "Do not include the paragraph about writing to the Free Software Foundation's mailing address from the sample GPL notice. The FSF has changed addresses in the past, and may do so again. Linux already includes a copy of the GPL.\n" . $herevet)
- }
- if ($realfile =~ /Kconfig/ &&
-
-
-
- $line =~ /^\+\s*(?:config|menuconfig|choice)\b/) {
- my $length = 0;
- my $cnt = $realcnt;
- my $ln = $linenr + 1;
- my $f;
- my $is_start = 0;
- my $is_end = 0;
- for (; $cnt > 0 && defined $lines[$ln - 1]; $ln++) {
- $f = $lines[$ln - 1];
- $cnt-- if ($lines[$ln - 1] !~ /^-/);
- $is_end = $lines[$ln - 1] =~ /^\+/;
- next if ($f =~ /^-/);
- last if (!$file && $f =~ /^\@\@/);
- if ($lines[$ln - 1] =~ /^\+\s*(?:bool|tristate|prompt)\s*["']/) {
- $is_start = 1;
- } elsif ($lines[$ln - 1] =~ /^\+\s*(?:---)?help(?:---)?$/) {
- $length = -1;
- }
- $f =~ s/^.//;
- $f =~ s/#.*//;
- $f =~ s/^\s+//;
- next if ($f =~ /^$/);
-
-
-
-
- if ($f =~ /^\s*(?:config|menuconfig|choice|endchoice|
- if|endif|menu|endmenu|source)\b/x) {
- $is_end = 1;
- last;
- }
- $length++;
- }
- if ($is_start && $is_end && $length < $min_conf_desc_length) {
- WARN("CONFIG_DESCRIPTION",
- "please write a paragraph that describes the config symbol fully\n" . $herecurr);
- }
-
- }
- if ($realfile =~ /^MAINTAINERS$/) {
- if ($rawline =~ /^\+[A-Z]:/ &&
- $rawline !~ /^\+[A-Z]:\t\S/) {
- if (WARN("MAINTAINERS_STYLE",
- "MAINTAINERS entries use one tab after TYPE:\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~ s/^(\+[A-Z]):\s*/$1:\t/;
- }
- }
- my $preferred_order = 'MRLSWQBCPTFXNK';
- if ($rawline =~ /^\+[A-Z]:/ &&
- $prevrawline =~ /^[\+ ][A-Z]:/) {
- $rawline =~ /^\+([A-Z]):\s*(.*)/;
- my $cur = $1;
- my $curval = $2;
- $prevrawline =~ /^[\+ ]([A-Z]):\s*(.*)/;
- my $prev = $1;
- my $prevval = $2;
- my $curindex = index($preferred_order, $cur);
- my $previndex = index($preferred_order, $prev);
- if ($curindex < 0) {
- WARN("MAINTAINERS_STYLE",
- "Unknown MAINTAINERS entry type: '$cur'\n" . $herecurr);
- } else {
- if ($previndex >= 0 && $curindex < $previndex) {
- WARN("MAINTAINERS_STYLE",
- "Misordered MAINTAINERS entry - list '$cur:' before '$prev:'\n" . $hereprev);
- } elsif ((($prev eq 'F' && $cur eq 'F') ||
- ($prev eq 'X' && $cur eq 'X')) &&
- ($prevval cmp $curval) > 0) {
- WARN("MAINTAINERS_STYLE",
- "Misordered MAINTAINERS entry - list file patterns in alphabetic order\n" . $hereprev);
- }
- }
- }
- }
- if ($realfile =~ /Kconfig/ &&
- $line =~ /^\+\s*\bboolean\b/) {
- WARN("CONFIG_TYPE_BOOLEAN",
- "Use of boolean is deprecated, please use bool instead.\n" . $herecurr);
- }
- if (($realfile =~ /Makefile.*/ || $realfile =~ /Kbuild.*/) &&
- ($line =~ /\+(EXTRA_[A-Z]+FLAGS).*/)) {
- my $flag = $1;
- my $replacement = {
- 'EXTRA_AFLAGS' => 'asflags-y',
- 'EXTRA_CFLAGS' => 'ccflags-y',
- 'EXTRA_CPPFLAGS' => 'cppflags-y',
- 'EXTRA_LDFLAGS' => 'ldflags-y',
- };
- WARN("DEPRECATED_VARIABLE",
- "Use of $flag is deprecated, please use \`$replacement->{$flag} instead.\n" . $herecurr) if ($replacement->{$flag});
- }
- if ($realfile =~ /Kconfig/ && $rawline =~ /^\+ /) {
- my $herevet = "$here\n" . cat_vet($rawline) . "\n";
- WARN("LEADING_SPACE",
- "please, no spaces at the start of a line\n" . $herevet);
- }
- if (defined $root &&
- (($realfile =~ /\.dtsi?$/ && $line =~ /^\+\s*compatible\s*=\s*\"/) ||
- ($realfile =~ /\.[ch]$/ && $line =~ /^\+.*\.compatible\s*=\s*\"/))) {
- my @compats = $rawline =~ /\"([a-zA-Z0-9\-\,\.\+_]+)\"/g;
- my $dt_path = $root . "/dts/bindings/";
- my $vp_file = $dt_path . "vendor-prefixes.txt";
- foreach my $compat (@compats) {
- my $compat2 = $compat;
- $compat2 =~ s/\,[a-zA-Z0-9]*\-/\,<\.\*>\-/;
- my $compat3 = $compat;
- $compat3 =~ s/\,([a-z]*)[0-9]*\-/\,$1<\.\*>\-/;
- `grep -Erq "$compat|$compat2|$compat3" $dt_path`;
- if ( $? >> 8 ) {
- WARN("UNDOCUMENTED_DT_STRING",
- "DT compatible string \"$compat\" appears un-documented -- check $dt_path\n" . $herecurr);
- }
- next if $compat !~ /^([a-zA-Z0-9\-]+)\,/;
- my $vendor = $1;
- `grep -Eq "^$vendor\\b" $vp_file`;
- if ( $? >> 8 ) {
- WARN("UNDOCUMENTED_DT_STRING",
- "DT compatible string vendor \"$vendor\" appears un-documented -- check $vp_file\n" . $herecurr);
- }
- }
- }
- if ($realline == $checklicenseline) {
- if ($rawline =~ /^[ \+]\s*\#\!\s*\//) {
- $checklicenseline = 2;
- } elsif ($rawline =~ /^\+/) {
- my $comment = "";
- if ($realfile =~ /\.(h|s|S)$/) {
- $comment = '/*';
- } elsif ($realfile =~ /\.(c|dts|dtsi)$/) {
- $comment = '//';
- } elsif (($checklicenseline == 2) || $realfile =~ /\.(sh|pl|py|awk|tc|yaml)$/) {
- $comment = '#';
- } elsif ($realfile =~ /\.rst$/) {
- $comment = '..';
- }
- if ($realfile =~ /\.[chsS]$/ &&
- $rawline =~ /SPDX-License-Identifier:/ &&
- $rawline !~ m@^\+\s*\Q$comment\E\s*@) {
- WARN("SPDX_LICENSE_TAG",
- "Improper SPDX comment style for '$realfile', please use '$comment' instead\n" . $herecurr);
- }
- if ($comment !~ /^$/ &&
- $rawline !~ m@^\+\Q$comment\E SPDX-License-Identifier: @) {
- WARN("SPDX_LICENSE_TAG",
- "Missing or malformed SPDX-License-Identifier tag in line $checklicenseline\n" . $herecurr);
- } elsif ($rawline =~ /(SPDX-License-Identifier: .*)/) {
- my $spdx_license = $1;
- if (!is_SPDX_License_valid($spdx_license)) {
- WARN("SPDX_LICENSE_TAG",
- "'$spdx_license' is not supported in LICENSES/...\n" . $herecurr);
- }
- if ($realfile =~ m@^Documentation/devicetree/bindings/@ &&
- not $spdx_license =~ /GPL-2\.0.*BSD-2-Clause/) {
- my $msg_level = \&WARN;
- $msg_level = \&CHK if ($file);
- if (&{$msg_level}("SPDX_LICENSE_TAG",
- "DT binding documents should be licensed (GPL-2.0-only OR BSD-2-Clause)\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~ s/SPDX-License-Identifier: .*/SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)/;
- }
- }
- }
- }
- }
- next if ($realfile !~ /\.(h|c|s|S|sh|dtsi|dts)$/);
- if ($realline != $checklicenseline &&
- $rawline =~ /\bSPDX-License-Identifier:/ &&
- substr($line, @-, @+ - @-) eq "$;" x (@+ - @-)) {
- WARN("SPDX_LICENSE_TAG",
- "Misplaced SPDX-License-Identifier tag - use line $checklicenseline instead\n" . $herecurr);
- }
- if ($line =~ /^\+/ && $length > $max_line_length) {
- my $msg_type = "LONG_LINE";
-
-
-
- if ($line =~ /^\+\s*$logFunctions\s*\(\s*(?:(?:KERN_\S+\s*|[^"]*))?($String\s*(?:|,|\)\s*;)\s*)$/ &&
- length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) {
- $msg_type = "";
-
-
- } elsif ($line =~ /^\+\s*$String\s*(?:\s*|,|\)\s*;)\s*$/ ||
- $line =~ /^\+\s*#\s*define\s+\w+\s+$String$/) {
- $msg_type = "";
-
- } elsif ($line =~ /^\+.*\bEFI_GUID\s*\(/ ||
- $line =~ /^\+\s*(?:\w+)?\s*DEFINE_PER_CPU/) {
- $msg_type = "";
-
- } elsif ($rawline =~ /^\+.*\b[a-z][\w\.\+\-]*:\/\/\S+/i) {
- $msg_type = "";
-
-
- } elsif ($line =~ /($;[\s$;]*)$/ &&
- length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) {
- $msg_type = "LONG_LINE_COMMENT"
-
- } elsif ($sline =~ /\s*($String(?:\s*(?:\\|,\s*|\)\s*;\s*))?)$/ &&
- length(expand_tabs(substr($line, 1, length($line) - length($1) - 1))) <= $max_line_length) {
- $msg_type = "LONG_LINE_STRING"
- }
- if ($msg_type ne "" &&
- (show_type("LONG_LINE") || show_type($msg_type))) {
- my $msg_level = \&WARN;
- $msg_level = \&CHK if ($file);
- &{$msg_level}($msg_type,
- "line length of $length exceeds $max_line_length columns\n" . $herecurr);
- }
- }
- if ($line =~ /^\+/ && defined $lines[$linenr] && $lines[$linenr] =~ /^\\ No newline at end of file/) {
- WARN("MISSING_EOF_NEWLINE",
- "adding a line without newline at end of file\n" . $herecurr);
- }
- next if ($realfile !~ /\.(h|c|pl|dtsi|dts)$/);
- if ($rawline =~ /^\+\s* \t\s*\S/ ||
- $rawline =~ /^\+\s* \s*/) {
- my $herevet = "$here\n" . cat_vet($rawline) . "\n";
- $rpt_cleaners = 1;
- if (ERROR("CODE_INDENT",
- "code indent should use tabs where possible\n" . $herevet) &&
- $fix) {
- $fixed[$fixlinenr] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
- }
- }
- if ($rawline =~ /^\+/) {
- while ($rawline =~ /\b($word_pattern) (?=($word_pattern))/g) {
- my $first = $1;
- my $second = $2;
- if ($first =~ /(?:struct|union|enum)/) {
- pos($rawline) += length($first) + length($second) + 1;
- next;
- }
- next if ($first ne $second);
- next if ($first eq 'long');
- if (WARN("REPEATED_WORD",
- "Possible repeated word: '$first'\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~ s/\b$first $second\b/$first/;
- }
- }
-
- if ($prevline =~ /$;+\s*$/ &&
- $prevrawline =~ /($word_pattern)\s*$/) {
- my $last_word = $1;
- if ($rawline =~ /^\+\s*\*\s*$last_word /) {
- if (WARN("REPEATED_WORD",
- "Possible repeated word: '$last_word'\n" . $hereprev) &&
- $fix) {
- $fixed[$fixlinenr] =~ s/(\+\s*\*\s*)$last_word /$1/;
- }
- }
- }
- }
- if ($rawline =~ /^\+/ && $rawline =~ / \t/) {
- my $herevet = "$here\n" . cat_vet($rawline) . "\n";
- if (WARN("SPACE_BEFORE_TAB",
- "please, no space before tabs\n" . $herevet) &&
- $fix) {
- while ($fixed[$fixlinenr] =~
- s/(^\+.*) {$tabsize,$tabsize}\t/$1\t\t/) {}
- while ($fixed[$fixlinenr] =~
- s/(^\+.*) +\t/$1\t/) {}
- }
- }
- if ($sline =~ /^\+\s+($Assignment)[^=]/) {
- CHK("ASSIGNMENT_CONTINUATIONS",
- "Assignment operator '$1' should be on the previous line\n" . $hereprev);
- }
- if ($rawline =~ /^\+\s*(&&|\|\|)/) {
- CHK("LOGICAL_CONTINUATIONS",
- "Logical continuations should be on the previous line\n" . $hereprev);
- }
- if ($perl_version_ok &&
- $sline =~ /^\+\t+( +)(?:$c90_Keywords\b|\{\s*$|\}\s*(?:else\b|while\b|\s*$)|$Declare\s*$Ident\s*[;=])/) {
- my $indent = length($1);
- if ($indent % $tabsize) {
- if (WARN("TABSTOP",
- "Statements should start on a tabstop\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~ s@(^\+\t+) +@$1 . "\t" x ($indent/$tabsize)@e;
- }
- }
- }
- if ($perl_version_ok &&
- $prevline =~ /^\+([ \t]*)((?:$c90_Keywords(?:\s+if)\s*)|(?:$Declare\s*)?(?:$Ident|\(\s*\*\s*$Ident\s*\))\s*|(?:\*\s*)*$Lval\s*=\s*$Ident\s*)\(.*(\&\&|\|\||,)\s*$/) {
- $prevline =~ /^\+(\t*)(.*)$/;
- my $oldindent = $1;
- my $rest = $2;
- my $pos = pos_last_openparen($rest);
- if ($pos >= 0) {
- $line =~ /^(\+| )([ \t]*)/;
- my $newindent = $2;
- my $goodtabindent = $oldindent .
- "\t" x ($pos / $tabsize) .
- " " x ($pos % $tabsize);
- my $goodspaceindent = $oldindent . " " x $pos;
- if ($newindent ne $goodtabindent &&
- $newindent ne $goodspaceindent) {
- if (CHK("PARENTHESIS_ALIGNMENT",
- "Alignment should match open parenthesis\n" . $hereprev) &&
- $fix && $line =~ /^\+/) {
- $fixed[$fixlinenr] =~
- s/^\+[ \t]*/\+$goodtabindent/;
- }
- }
- }
- }
- if ($line =~ /^\+(.*)\(\s*$Type\s*\)([ \t]++)((?![={]|\\$|$Attribute|__attribute__))/ &&
- (!defined($1) || $1 !~ /\b(?:sizeof|__alignof__)\s*$/)) {
- if (CHK("SPACING",
- "No space is necessary after a cast\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~
- s/(\(\s*$Type\s*\))[ \t]+/$1/;
- }
- }
- if ($realfile =~ m@^(drivers/net/|net/)@ &&
- $prevrawline =~ /^\+[ \t]*\/\*[ \t]*$/ &&
- $rawline =~ /^\+[ \t]*\*/ &&
- $realline > 2) {
- WARN("NETWORKING_BLOCK_COMMENT_STYLE",
- "networking block comments don't use an empty /* line, use /* Comment...\n" . $hereprev);
- }
- if ($prevline =~ /$;[ \t]*$/ &&
- $prevrawline =~ /^\+.*?\/\*/ &&
- $prevrawline !~ /\*\/[ \t]*$/ &&
- $rawline =~ /^\+/ &&
- $rawline !~ /^\+[ \t]*\*/) {
- WARN("BLOCK_COMMENT_STYLE",
- "Block comments use * on subsequent lines\n" . $hereprev);
- }
- if ($rawline !~ m@^\+[ \t]*\*/[ \t]*$@ && #trailing */
- $rawline !~ m@^\+.*/\*.*\*/[ \t]*$@ &&
- $rawline !~ m@^\+.*\*{2,}/[ \t]*$@ &&
- $rawline =~ m@^\+[ \t]*.+\*\/[ \t]*$@) {
- WARN("BLOCK_COMMENT_STYLE",
- "Block comments use a trailing */ on a separate line\n" . $herecurr);
- }
- if ($prevline =~ /$;[ \t]*$/ &&
- $line =~ /^\+[ \t]*$;/ &&
- $rawline =~ /^\+[ \t]*\*/ &&
- (($prevrawline =~ /^\+.*?\/\*/ &&
- $prevrawline !~ /\*\/[ \t]*$/) ||
- $prevrawline =~ /^\+[ \t]*\*/)) {
- my $oldindent;
- $prevrawline =~ m@^\+([ \t]*/?)\*@;
- if (defined($1)) {
- $oldindent = expand_tabs($1);
- } else {
- $prevrawline =~ m@^\+(.*/?)\*@;
- $oldindent = expand_tabs($1);
- }
- $rawline =~ m@^\+([ \t]*)\*@;
- my $newindent = $1;
- $newindent = expand_tabs($newindent);
- if (length($oldindent) ne length($newindent)) {
- WARN("BLOCK_COMMENT_STYLE",
- "Block comments should align the * on each line\n" . $hereprev);
- }
- }
- if ($prevline =~ /^[\+ ]};?\s*$/ &&
- $line =~ /^\+/ &&
- !($line =~ /^\+\s*$/ ||
- $line =~ /^\+\s*EXPORT_SYMBOL/ ||
- $line =~ /^\+\s*MODULE_/i ||
- $line =~ /^\+\s*\#\s*(?:end|elif|else)/ ||
- $line =~ /^\+[a-z_]*init/ ||
- $line =~ /^\+\s*(?:static\s+)?[A-Z_]*ATTR/ ||
- $line =~ /^\+\s*DECLARE/ ||
- $line =~ /^\+\s*builtin_[\w_]*driver/ ||
- $line =~ /^\+\s*__setup/)) {
- if (CHK("LINE_SPACING",
- "Please use a blank line after function/struct/union/enum declarations\n" . $hereprev) &&
- $fix) {
- fix_insert_line($fixlinenr, "\+");
- }
- }
- if ($prevline =~ /^[\+ ]\s*$/ &&
- $line =~ /^\+\s*$/ &&
- $last_blank_line != ($linenr - 1)) {
- if (CHK("LINE_SPACING",
- "Please don't use multiple blank lines\n" . $hereprev) &&
- $fix) {
- fix_delete_line($fixlinenr, $rawline);
- }
- $last_blank_line = $linenr;
- }
- if ($sline =~ /^\+\s+\S/ &&
-
- ($prevline =~ /^\+\s+$Declare\s*$Ident\s*[=,;:\[]/ ||
-
- $prevline =~ /^\+\s+$Declare\s*\(\s*\*\s*$Ident\s*\)\s*[=,;:\[\(]/ ||
-
- $prevline =~ /^\+\s+$Ident(?:\s+|\s*\*\s*)$Ident\s*[=,;\[]/ ||
-
- $prevline =~ /^\+\s+$declaration_macros/) &&
-
- !($prevline =~ /^\+\s+$c90_Keywords\b/ ||
-
- $prevline =~ /(?:$Compare|$Assignment|$Operators)\s*$/ ||
-
- $prevline =~ /(?:\{\s*|\\)$/) &&
-
- !($sline =~ /^\+\s+$Declare\s*$Ident\s*[=,;:\[]/ ||
-
- $sline =~ /^\+\s+$Declare\s*\(\s*\*\s*$Ident\s*\)\s*[=,;:\[\(]/ ||
-
- $sline =~ /^\+\s+(?:volatile\s+)?$Ident(?:\s+|\s*\*\s*)$Ident\s*[=,;\[]/ ||
-
- $sline =~ /^\+\s+$declaration_macros/ ||
-
- $sline =~ /^\+\s+(?:static\s+)?(?:const\s+)?(?:union|struct|enum|typedef)\b/ ||
-
- $sline =~ /^\+\s+(?:$|[\{\}\.\#\"\?\:\(\[])/ ||
-
- $sline =~ /^\+\s+$Ident\s*:\s*\d+\s*[,;]/ ||
-
- $sline =~ /^\+\s+\(?\s*(?:$Compare|$Assignment|$Operators)/) &&
-
- (($prevline =~ /\+(\s+)\S/) && $sline =~ /^\+$1\S/)) {
- if (WARN("LINE_SPACING",
- "Missing a blank line after declarations\n" . $hereprev) &&
- $fix) {
- fix_insert_line($fixlinenr, "\+");
- }
- }
- if ($rawline =~ /^\+ / && $line !~ /^\+ *(?:$;|#|$Ident:)/) {
- my $herevet = "$here\n" . cat_vet($rawline) . "\n";
- if (WARN("LEADING_SPACE",
- "please, no spaces at the start of a line\n" . $herevet) &&
- $fix) {
- $fixed[$fixlinenr] =~ s/^\+([ \t]+)/"\+" . tabify($1)/e;
- }
- }
- next if ($realfile !~ /\.(h|c)$/);
- if ($line =~ /^\+.*([\[\(])\s*$/) {
- CHK("OPEN_ENDED_LINE",
- "Lines should not end with a '$1'\n" . $herecurr);
- }
- if ($sline =~ /^\+\{\s*$/ &&
- $prevline =~ /^\+(?:(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*)?($Ident)\(/) {
- $context_function = $1;
- }
- if ($sline =~ /^\+\}\s*$/) {
- undef $context_function;
- }
- if ($sline =~ /^\+([\t]+)(?:}[ \t]*)?else(?:[ \t]*{)?\s*$/) {
- my $tabs = length($1) + 1;
- if ($prevline =~ /^\+\t{$tabs,$tabs}break\b/ ||
- ($prevline =~ /^\+\t{$tabs,$tabs}return\b/ &&
- defined $lines[$linenr] &&
- $lines[$linenr] !~ /^[ \+]\t{$tabs,$tabs}return/)) {
- WARN("UNNECESSARY_ELSE",
- "else is not generally useful after a break or return\n" . $hereprev);
- }
- }
- if ($sline =~ /^\+([\t]+)break\s*;\s*$/) {
- my $tabs = $1;
- if ($prevline =~ /^\+$tabs(?:goto|return)\b/) {
- WARN("UNNECESSARY_BREAK",
- "break is not useful after a goto or return\n" . $hereprev);
- }
- }
- if ($rawline =~ /^\+.*\$(Revision|Log|Id)(?:\$|)/) {
- WARN("CVS_KEYWORD",
- "CVS style keyword markers, these will _not_ be updated\n". $herecurr);
- }
- if ($line =~ /\b(__dev(init|exit)(data|const|))\b/) {
- WARN("HOTPLUG_SECTION",
- "Using $1 is unnecessary\n" . $herecurr);
- }
- my ($stat, $cond, $line_nr_next, $remain_next, $off_next,
- $realline_next);
- if ($linenr > $suppress_statement &&
- $realcnt && $sline =~ /.\s*\S/) {
- ($stat, $cond, $line_nr_next, $remain_next, $off_next) =
- ctx_statement_block($linenr, $realcnt, 0);
- $stat =~ s/\n./\n /g;
- $cond =~ s/\n./\n /g;
-
-
-
- my $frag = $stat; $frag =~ s/;+\s*$//;
- if ($frag !~ /(?:{|;)/) {
- $suppress_statement = $line_nr_next;
- }
-
- $realline_next = $line_nr_next;
- if (defined $realline_next &&
- (!defined $lines[$realline_next - 1] ||
- substr($lines[$realline_next - 1], $off_next) =~ /^\s*$/)) {
- $realline_next++;
- }
- my $s = $stat;
- $s =~ s/{.*$//s;
-
- if ($s =~ /$Ident:\*$/s) {
-
- } elsif ($s =~ /^.\s*$Ident\s*\(/s) {
- } elsif ($s =~ /^.\s*else\b/s) {
-
- } elsif ($prev_values eq 'E' && $s =~ /^.\s*(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?((?:\s*$Ident)+?)\b(?:\s+$Sparse)?\s*\**\s*(?:$Ident|\(\*[^\)]*\))(?:\s*$Modifier)?\s*(?:;|=|,|\()/s) {
- my $type = $1;
- $type =~ s/\s+/ /g;
- possible($type, "A:" . $s);
-
- } elsif ($s =~ /^.(?:$Storage\s+)?(?:$Inline\s+)?(?:const\s+)?($Ident)\b\s*(?!:)/s) {
- possible($1, "B:" . $s);
- }
-
- while ($s =~ /\(($Ident)(?:\s+$Sparse)*[\s\*]+\s*\)/sg) {
- possible($1, "C:" . $s);
- }
-
-
-
- if ($prev_values eq 'E' && $s =~ /^(.(?:typedef\s*)?(?:(?:$Storage|$Inline)\s*)*\s*$Type\s*(?:\b$Ident|\(\*\s*$Ident\))\s*)\(/s) {
- my ($name_len) = length($1);
- my $ctx = $s;
- substr($ctx, 0, $name_len + 1, '');
- $ctx =~ s/\)[^\)]*$//;
- for my $arg (split(/\s*,\s*/, $ctx)) {
- if ($arg =~ /^(?:const\s+)?($Ident)(?:\s+$Sparse)*\s*\**\s*(:?\b$Ident)?$/s || $arg =~ /^($Ident)$/s) {
- possible($1, "D:" . $s);
- }
- }
- }
- }
- if ($line=~/\bswitch\s*\(.*\)/) {
- my $err = '';
- my $sep = '';
- my @ctx = ctx_block_outer($linenr, $realcnt);
- shift(@ctx);
- for my $ctx (@ctx) {
- my ($clen, $cindent) = line_stats($ctx);
- if ($ctx =~ /^\+\s*(case\s+|default:)/ &&
- $indent != $cindent) {
- $err .= "$sep$ctx\n";
- $sep = '';
- } else {
- $sep = "[...]\n";
- }
- }
- if ($err ne '') {
- ERROR("SWITCH_CASE_INDENT_LEVEL",
- "switch and case should be at the same indent\n$hereline$err");
- }
- }
- if ($line =~ /(.*)\b((?:if|while|for|switch|(?:[A-Z_]+|)FOR_EACH[A-Z_]+)\s*\(|do\b|else\b)/ && $line !~ /^.\s*\#/) {
- my $pre_ctx = "$1$2";
- my ($level, @ctx) = ctx_statement_level($linenr, $realcnt, 0);
- if ($line =~ /^\+\t{6,}/) {
- WARN("DEEP_INDENTATION",
- "Too many leading tabs - consider code refactoring\n" . $herecurr);
- }
- my $ctx_cnt = $realcnt - $#ctx - 1;
- my $ctx = join("\n", @ctx);
- my $ctx_ln = $linenr;
- my $ctx_skip = $realcnt;
- while ($ctx_skip > $ctx_cnt || ($ctx_skip == $ctx_cnt &&
- defined $lines[$ctx_ln - 1] &&
- $lines[$ctx_ln - 1] =~ /^-/)) {
-
- $ctx_skip-- if (!defined $lines[$ctx_ln - 1] || $lines[$ctx_ln - 1] !~ /^-/);
- $ctx_ln++;
- }
-
-
- if ($ctx !~ /{\s*/ && defined($lines[$ctx_ln - 1]) && $lines[$ctx_ln - 1] =~ /^\+\s*{/) {
- ERROR("OPEN_BRACE",
- "that open brace { should be on the previous line\n" .
- "$here\n$ctx\n$rawlines[$ctx_ln - 1]\n");
- }
- if ($level == 0 && $pre_ctx !~ /}\s*while\s*\($/ &&
- $ctx =~ /\)\s*\;\s*$/ &&
- defined $lines[$ctx_ln - 1])
- {
- my ($nlength, $nindent) = line_stats($lines[$ctx_ln - 1]);
- if ($nindent > $indent) {
- WARN("TRAILING_SEMICOLON",
- "trailing semicolon indicates no statements, indent implies otherwise\n" .
- "$here\n$ctx\n$rawlines[$ctx_ln - 1]\n");
- }
- }
- }
- if ($line =~ /\b(?:(?:if|while|for|(?:[A-Z_]+|)FOR_EACH[A-Z_]+)\s*\(|(?:do|else)\b)/ && $line !~ /^.\s*#/ && $line !~ /\}\s*while\s*/) {
- ($stat, $cond, $line_nr_next, $remain_next, $off_next) =
- ctx_statement_block($linenr, $realcnt, 0)
- if (!defined $stat);
- my ($s, $c) = ($stat, $cond);
- substr($s, 0, length($c), '');
-
- $s =~ s/$;/ /g;
- $c =~ s/$;/ /g;
-
- my @newlines = ($c =~ /\n/gs);
- my $cond_lines = 1 + $#newlines;
-
-
-
- $s =~ s/\n./\n/gs;
- while ($s =~ /\n\s+\\\n/) {
- $cond_lines += $s =~ s/\n\s+\\\n/\n/g;
- }
-
-
-
-
-
- my $continuation = 0;
- my $check = 0;
- $s =~ s/^.*\bdo\b//;
- $s =~ s/^\s*{//;
- if ($s =~ s/^\s*\\//) {
- $continuation = 1;
- }
- if ($s =~ s/^\s*?\n//) {
- $check = 1;
- $cond_lines++;
- }
-
-
- if (($prevline =~ /^.\s*#\s*define\s/ ||
- $prevline =~ /\\\s*$/) && $continuation == 0) {
- $check = 0;
- }
- my $cond_ptr = -1;
- $continuation = 0;
- while ($cond_ptr != $cond_lines) {
- $cond_ptr = $cond_lines;
-
-
- if ($s =~ /^\s*\#\s*(?:else|elif)/) {
- $check = 0;
- }
-
-
-
-
- if ($continuation ||
- $s =~ /^\s*?\n/ ||
- $s =~ /^\s*#\s*?/ ||
- $s =~ /^\s*$Ident\s*:/) {
- $continuation = ($s =~ /^.*?\\\n/) ? 1 : 0;
- if ($s =~ s/^.*?\n//) {
- $cond_lines++;
- }
- }
- }
- my (undef, $sindent) = line_stats("+" . $s);
- my $stat_real = raw_line($linenr, $cond_lines);
-
-
- if (!defined($stat_real) ||
- $stat !~ /^\+/ && $stat_real !~ /^\+/) {
- $check = 0;
- }
- if (defined($stat_real) && $cond_lines > 1) {
- $stat_real = "[...]\n$stat_real";
- }
-
- if ($check && $s ne '' &&
- (($sindent % $tabsize) != 0 ||
- ($sindent < $indent) ||
- ($sindent == $indent &&
- ($s !~ /^\s*(?:\}|\{|else\b)/)) ||
- ($sindent > $indent + $tabsize))) {
- WARN("SUSPECT_CODE_INDENT",
- "suspect code indent for conditional statements ($indent, $sindent)\n" . $herecurr . "$stat_real\n");
- }
- }
-
- my $opline = $line; $opline =~ s/^./ /;
- my ($curr_values, $curr_vars) =
- annotate_values($opline . "\n", $prev_values);
- $curr_values = $prev_values . $curr_values;
- if ($dbg_values) {
- my $outline = $opline; $outline =~ s/\t/ /g;
- print "$linenr > .$outline\n";
- print "$linenr > $curr_values\n";
- print "$linenr > $curr_vars\n";
- }
- $prev_values = substr($curr_values, -1);
- next if ($line =~ /^[^\+]/);
- if ($prevline =~ /^\+.*$Lval\s*(?:\.|->)\s*$/ &&
- $line =~ /^\+\s*(?!\#\s*(?!define\s+|if))\s*$Lval/) {
- $prevline =~ /($Lval\s*(?:\.|->))\s*$/;
- my $ref = $1;
- $line =~ /^.\s*($Lval)/;
- $ref .= $1;
- $ref =~ s/\s//g;
- WARN("MULTILINE_DEREFERENCE",
- "Avoid multiple line dereference - prefer '$ref'\n" . $hereprev);
- }
- while ($line =~ m{\b($Declare)\s*(?!char\b|short\b|int\b|long\b)\s*($Ident)?\s*[=,;\[\)\(]}g) {
- my $type = $1;
- my $var = $2;
- $var = "" if (!defined $var);
- if ($type =~ /^(?:(?:$Storage|$Inline|$Attribute)\s+)*((?:un)?signed)((?:\s*\*)*)\s*$/) {
- my $sign = $1;
- my $pointer = $2;
- $pointer = "" if (!defined $pointer);
- if (WARN("UNSPECIFIED_INT",
- "Prefer '" . trim($sign) . " int" . rtrim($pointer) . "' to bare use of '$sign" . rtrim($pointer) . "'\n" . $herecurr) &&
- $fix) {
- my $decl = trim($sign) . " int ";
- my $comp_pointer = $pointer;
- $comp_pointer =~ s/\s//g;
- $decl .= $comp_pointer;
- $decl = rtrim($decl) if ($var eq "");
- $fixed[$fixlinenr] =~ s@\b$sign\s*\Q$pointer\E\s*$var\b@$decl$var@;
- }
- }
- }
- if ($dbg_type) {
- if ($line =~ /^.\s*$Declare\s*$/) {
- ERROR("TEST_TYPE",
- "TEST: is type\n" . $herecurr);
- } elsif ($dbg_type > 1 && $line =~ /^.+($Declare)/) {
- ERROR("TEST_NOT_TYPE",
- "TEST: is not type ($1 is)\n". $herecurr);
- }
- next;
- }
- if ($dbg_attr) {
- if ($line =~ /^.\s*$Modifier\s*$/) {
- ERROR("TEST_ATTR",
- "TEST: is attr\n" . $herecurr);
- } elsif ($dbg_attr > 1 && $line =~ /^.+($Modifier)/) {
- ERROR("TEST_NOT_ATTR",
- "TEST: is not attr ($1 is)\n". $herecurr);
- }
- next;
- }
- if ($line =~ /^.\s*{/ &&
- $prevline =~ /(?:^|[^=])=\s*$/) {
- if (ERROR("OPEN_BRACE",
- "that open brace { should be on the previous line\n" . $hereprev) &&
- $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
- fix_delete_line($fixlinenr - 1, $prevrawline);
- fix_delete_line($fixlinenr, $rawline);
- my $fixedline = $prevrawline;
- $fixedline =~ s/\s*=\s*$/ = {/;
- fix_insert_line($fixlinenr, $fixedline);
- $fixedline = $line;
- $fixedline =~ s/^(.\s*)\{\s*/$1/;
- fix_insert_line($fixlinenr, $fixedline);
- }
- }
- if ($rawline =~ m{^.\s*\
- my $path = $1;
- if ($path =~ m{//}) {
- ERROR("MALFORMED_INCLUDE",
- "malformed #include filename\n" . $herecurr);
- }
- if ($path =~ "^uapi/" && $realfile =~ m@\binclude/uapi/@) {
- ERROR("UAPI_INCLUDE",
- "No #include in ...include/uapi/... should use a uapi/ path prefix\n" . $herecurr);
- }
- }
- if ($line =~ m{//}) {
- if (ERROR("C99_COMMENTS",
- "do not use C99 // comments\n" . $herecurr) &&
- $fix) {
- my $line = $fixed[$fixlinenr];
- if ($line =~ /\/\/(.*)$/) {
- my $comment = trim($1);
- $fixed[$fixlinenr] =~ s@\/\/(.*)$@/\* $comment \*/@;
- }
- }
- }
- # Remove C99 comments.
- $line =~ s@//.*@@;
- $opline =~ s@//.*@@;
- # EXPORT_SYMBOL should immediately follow the thing it is exporting, consider
- # the whole statement.
- #print "APW <$lines[$realline_next - 1]>\n";
- if (defined $realline_next &&
- exists $lines[$realline_next - 1] &&
- !defined $suppress_export{$realline_next} &&
- ($lines[$realline_next - 1] =~ /EXPORT_SYMBOL.*\((.*)\)/ ||
- $lines[$realline_next - 1] =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) {
-
-
-
-
- my $name = $1;
- if ($stat =~ /^(?:.\s*}\s*\n)?.([A-Z_]+)\s*\(\s*($Ident)/ &&
- $name =~ /^${Ident}_$2/) {
- $suppress_export{$realline_next} = 1;
- } elsif ($stat !~ /(?:
- \n.}\s*$|
- ^.DEFINE_$Ident\(\Q$name\E\)|
- ^.DECLARE_$Ident\(\Q$name\E\)|
- ^.LIST_HEAD\(\Q$name\E\)|
- ^.(?:$Storage\s+)?$Type\s*\(\s*\*\s*\Q$name\E\s*\)\s*\(|
- \b\Q$name\E(?:\s+$Attribute)*\s*(?:;|=|\[|\()
- )/x) {
- $suppress_export{$realline_next} = 2;
- } else {
- $suppress_export{$realline_next} = 1;
- }
- }
- if (!defined $suppress_export{$linenr} &&
- $prevline =~ /^.\s*$/ &&
- ($line =~ /EXPORT_SYMBOL.*\((.*)\)/ ||
- $line =~ /EXPORT_UNUSED_SYMBOL.*\((.*)\)/)) {
- $suppress_export{$linenr} = 2;
- }
- if (defined $suppress_export{$linenr} &&
- $suppress_export{$linenr} == 2) {
- WARN("EXPORT_SYMBOL",
- "EXPORT_SYMBOL(foo); should immediately follow its function/variable\n" . $herecurr);
- }
- if ($line =~ /^\+$Type\s*$Ident(?:\s+$Modifier)*\s*=\s*($zero_initializer)\s*;/) {
- if (ERROR("GLOBAL_INITIALISERS",
- "do not initialise globals to $1\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~ s/(^.$Type\s*$Ident(?:\s+$Modifier)*)\s*=\s*$zero_initializer\s*;/$1;/;
- }
- }
- if ($line =~ /^\+.*\bstatic\s.*=\s*($zero_initializer)\s*;/) {
- if (ERROR("INITIALISED_STATIC",
- "do not initialise statics to $1\n" .
- $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~ s/(\bstatic\s.*?)\s*=\s*$zero_initializer\s*;/$1;/;
- }
- }
- while ($sline =~ m{(\b$TypeMisordered\b)}g) {
- my $tmp = trim($1);
- WARN("MISORDERED_TYPE",
- "type '$tmp' should be specified in [[un]signed] [short|int|long|long long] order\n" . $herecurr);
- }
- while ($sline =~ m{\b($TypeMisordered(\s*\*)*|$C90_int_types)\b}g) {
- my $type = trim($1);
- next if ($type !~ /\bint\b/);
- next if ($type !~ /\b(?:short|long\s+long|long)\b/);
- my $new_type = $type;
- $new_type =~ s/\b\s*int\s*\b/ /;
- $new_type =~ s/\b\s*(?:un)?signed\b\s*/ /;
- $new_type =~ s/^const\s+//;
- $new_type = "unsigned $new_type" if ($type =~ /\bunsigned\b/);
- $new_type = "const $new_type" if ($type =~ /^const\b/);
- $new_type =~ s/\s+/ /g;
- $new_type = trim($new_type);
- if (WARN("UNNECESSARY_INT",
- "Prefer '$new_type' over '$type' as the int is unnecessary\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~ s/\b\Q$type\E\b/$new_type/;
- }
- }
- if ($line =~ /\bstatic\s+const\s+char\s*\*\s*(\w+)\s*\[\s*\]\s*=\s*/) {
- WARN("STATIC_CONST_CHAR_ARRAY",
- "static const char * array should probably be static const char * const\n" .
- $herecurr);
- }
- if ($line =~ /^\+\s*const\s+(char|unsigned\s+char|_*u8|(?:[us]_)?int8_t)\s+\w+\s*\[\s*(?:\w+\s*)?\]\s*=\s*"/) {
- if (WARN("STATIC_CONST_CHAR_ARRAY",
- "const array should probably be static const\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~ s/(^.\s*)const\b/${1}static const/;
- }
- }
- if ($line =~ /\bstatic\s+char\s+(\w+)\s*\[\s*\]\s*=\s*"/) {
- WARN("STATIC_CONST_CHAR_ARRAY",
- "static char array declaration should probably be static const char\n" .
- $herecurr);
- }
- if ($sline =~ /\bconst\s+($BasicType)\s+const\b/) {
- my $found = $1;
- if ($sline =~ /\bconst\s+\Q$found\E\s+const\b\s*\*/) {
- WARN("CONST_CONST",
- "'const $found const *' should probably be 'const $found * const'\n" . $herecurr);
- } elsif ($sline !~ /\bconst\s+\Q$found\E\s+const\s+\w+\s*\[/) {
- WARN("CONST_CONST",
- "'const $found const' should probably be 'const $found'\n" . $herecurr);
- }
- }
- if ($line =~ /^.\s+(?:static\s+|const\s+)?char\s+\*\s*\w+\s*\[\s*\]\s*=\s*\{/) {
- WARN("STATIC_CONST_CHAR_ARRAY",
- "char * array declaration might be better as static const\n" .
- $herecurr);
- }
- if ($line =~ m@\bsizeof\s*\(\s*($Lval)\s*\)@) {
- my $array = $1;
- if ($line =~ m@\b(sizeof\s*\(\s*\Q$array\E\s*\)\s*/\s*sizeof\s*\(\s*\Q$array\E\s*\[\s*0\s*\]\s*\))@) {
- my $array_div = $1;
- if (WARN("ARRAY_SIZE",
- "Prefer ARRAY_SIZE($array)\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~ s/\Q$array_div\E/ARRAY_SIZE($array)/;
- }
- }
- }
- if ($line =~ /(\b$Type\s*$Ident)\s*\(\s*\)/) {
- if (ERROR("FUNCTION_WITHOUT_ARGS",
- "Bad function definition - $1() should probably be $1(void)\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~ s/(\b($Type)\s+($Ident))\s*\(\s*\)/$2 $3(void)/;
- }
- }
- if ($line =~ /\btypedef\s/ &&
- $line !~ /\btypedef\s+$Type\s*\(\s*\*?$Ident\s*\)\s*\(/ &&
- $line !~ /\btypedef\s+$Type\s+$Ident\s*\(/ &&
- $line !~ /\b$typeTypedefs\b/ &&
- $line !~ /\b__bitwise\b/) {
- WARN("NEW_TYPEDEFS",
- "do not add new typedefs\n" . $herecurr);
- }
-
- while ($line =~ m{(\($NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)\))}g) {
-
- my ($ident, $from, $to) = ($1, $2, $2);
-
- $to =~ s/^(\S)/ $1/;
-
- $to =~ s/\s+$//;
-
- while ($to =~ s/\*\s+\*/\*\*/) {
- }
- if ($from ne $to) {
- if (ERROR("POINTER_LOCATION",
- "\"(foo$from)\" should be \"(foo$to)\"\n" . $herecurr) &&
- $fix) {
- my $sub_from = $ident;
- my $sub_to = $ident;
- $sub_to =~ s/\Q$from\E/$to/;
- $fixed[$fixlinenr] =~
- s@\Q$sub_from\E@$sub_to@;
- }
- }
- }
- while ($line =~ m{(\b$NonptrType(\s*(?:$Modifier\b\s*|\*\s*)+)($Ident))}g) {
-
- my ($match, $from, $to, $ident) = ($1, $2, $2, $3);
-
- $to =~ s/^(\S)/ $1/;
-
- $to =~ s/\s+$//;
-
- while ($to =~ s/\*\s+\*/\*\*/) {
- }
-
- $to =~ s/(\b$Modifier$)/$1 /;
- if ($from ne $to && $ident !~ /^$Modifier$/) {
- if (ERROR("POINTER_LOCATION",
- "\"foo${from}bar\" should be \"foo${to}bar\"\n" . $herecurr) &&
- $fix) {
- my $sub_from = $match;
- my $sub_to = $match;
- $sub_to =~ s/\Q$from\E/$to/;
- $fixed[$fixlinenr] =~
- s@\Q$sub_from\E@$sub_to@;
- }
- }
- }
- if ($line =~ /\b(?:BUG|BUG_ON)\b/) {
- my $msg_level = \&WARN;
- $msg_level = \&CHK if ($file);
- &{$msg_level}("AVOID_BUG",
- "Avoid crashing the kernel - try using WARN_ON & recovery code rather than BUG() or BUG_ON()\n" . $herecurr);
- }
- if ($line =~ /\bLINUX_VERSION_CODE\b/) {
- WARN("LINUX_VERSION_CODE",
- "LINUX_VERSION_CODE should be avoided, code should be for the version to which it is merged\n" . $herecurr);
- }
- if ($line =~ /\bprintk_ratelimit\s*\(/) {
- WARN("PRINTK_RATELIMITED",
- "Prefer printk_ratelimited or pr_<level>_ratelimited to printk_ratelimit\n" . $herecurr);
- }
- if ($line =~ /\bprintk\s*\(\s*(?!KERN_[A-Z]+\b)/) {
- WARN("PRINTK_WITHOUT_KERN_LEVEL",
- "printk() should include KERN_<LEVEL> facility level\n" . $herecurr);
- }
- if ($line =~ /\bprintk\s*\(\s*KERN_([A-Z]+)/) {
- my $orig = $1;
- my $level = lc($orig);
- $level = "warn" if ($level eq "warning");
- my $level2 = $level;
- $level2 = "dbg" if ($level eq "debug");
- WARN("PREFER_PR_LEVEL",
- "Prefer [subsystem eg: netdev]_$level2([subsystem]dev, ... then dev_$level2(dev, ... then pr_$level(... to printk(KERN_$orig ...\n" . $herecurr);
- }
- if ($line =~ /\bdev_printk\s*\(\s*KERN_([A-Z]+)/) {
- my $orig = $1;
- my $level = lc($orig);
- $level = "warn" if ($level eq "warning");
- $level = "dbg" if ($level eq "debug");
- WARN("PREFER_DEV_LEVEL",
- "Prefer dev_$level(... to dev_printk(KERN_$orig, ...\n" . $herecurr);
- }
- if ($line =~ /\bENOSYS\b/) {
- WARN("ENOSYS",
- "ENOSYS means 'invalid syscall nr' and nothing else\n" . $herecurr);
- }
- if (!$file && $line =~ /\bENOTSUPP\b/) {
- if (WARN("ENOTSUPP",
- "ENOTSUPP is not a SUSV4 error code, prefer EOPNOTSUPP\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~ s/\bENOTSUPP\b/EOPNOTSUPP/;
- }
- }
- if ($perl_version_ok &&
- $sline =~ /$Type\s*$Ident\s*$balanced_parens\s*\{/ &&
- $sline !~ /\#\s*define\b.*do\s*\{/ &&
- $sline !~ /}/) {
- if (ERROR("OPEN_BRACE",
- "open brace '{' following function definitions go on the next line\n" . $herecurr) &&
- $fix) {
- fix_delete_line($fixlinenr, $rawline);
- my $fixed_line = $rawline;
- $fixed_line =~ /(^..*$Type\s*$Ident\(.*\)\s*){(.*)$/;
- my $line1 = $1;
- my $line2 = $2;
- fix_insert_line($fixlinenr, ltrim($line1));
- fix_insert_line($fixlinenr, "\+{");
- if ($line2 !~ /^\s*$/) {
- fix_insert_line($fixlinenr, "\+\t" . trim($line2));
- }
- }
- }
- if ($line =~ /^.\s*{/ &&
- $prevline =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident)?\s*$/) {
- if (ERROR("OPEN_BRACE",
- "open brace '{' following $1 go on the same line\n" . $hereprev) &&
- $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
- fix_delete_line($fixlinenr - 1, $prevrawline);
- fix_delete_line($fixlinenr, $rawline);
- my $fixedline = rtrim($prevrawline) . " {";
- fix_insert_line($fixlinenr, $fixedline);
- $fixedline = $rawline;
- $fixedline =~ s/^(.\s*)\{\s*/$1\t/;
- if ($fixedline !~ /^\+\s*$/) {
- fix_insert_line($fixlinenr, $fixedline);
- }
- }
- }
- if ($line =~ /^.\s*(?:typedef\s+)?(enum|union|struct)(?:\s+$Ident){1,2}[=\{]/) {
- if (WARN("SPACING",
- "missing space after $1 definition\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~
- s/^(.\s*(?:typedef\s+)?(?:enum|union|struct)(?:\s+$Ident){1,2})([=\{])/$1 $2/;
- }
- }
- if ($line =~ /^.\s*($Declare)\((\s*)\*(\s*)($Ident)(\s*)\)(\s*)\(/) {
- my $declare = $1;
- my $pre_pointer_space = $2;
- my $post_pointer_space = $3;
- my $funcname = $4;
- my $post_funcname_space = $5;
- my $pre_args_space = $6;
- my $post_declare_space = "";
- if ($declare =~ /(\s+)$/) {
- $post_declare_space = $1;
- $declare = rtrim($declare);
- }
- if ($declare !~ /\*$/ && $post_declare_space =~ /^$/) {
- WARN("SPACING",
- "missing space after return type\n" . $herecurr);
- $post_declare_space = " ";
- }
- if (defined $pre_pointer_space &&
- $pre_pointer_space =~ /^\s/) {
- WARN("SPACING",
- "Unnecessary space after function pointer open parenthesis\n" . $herecurr);
- }
- if (defined $post_pointer_space &&
- $post_pointer_space =~ /^\s/) {
- WARN("SPACING",
- "Unnecessary space before function pointer name\n" . $herecurr);
- }
- if (defined $post_funcname_space &&
- $post_funcname_space =~ /^\s/) {
- WARN("SPACING",
- "Unnecessary space after function pointer name\n" . $herecurr);
- }
- if (defined $pre_args_space &&
- $pre_args_space =~ /^\s/) {
- WARN("SPACING",
- "Unnecessary space before function pointer arguments\n" . $herecurr);
- }
- if (show_type("SPACING") && $fix) {
- $fixed[$fixlinenr] =~
- s/^(.\s*)$Declare\s*\(\s*\*\s*$Ident\s*\)\s*\(/$1 . $declare . $post_declare_space . '(*' . $funcname . ')('/ex;
- }
- }
- while ($line =~ /(.*?\s)\[/g) {
- my ($where, $prefix) = ($-[1], $1);
- if ($prefix !~ /$Type\s+$/ &&
- ($where != 0 || $prefix !~ /^.\s+$/) &&
- $prefix !~ /[{,:]\s+$/ &&
- $prefix !~ /:\s+$/) {
- if (ERROR("BRACKET_SPACE",
- "space prohibited before open square bracket '['\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~
- s/^(\+.*?)\s+\[/$1\[/;
- }
- }
- }
- while ($line =~ /($Ident)\s+\(/g) {
- my $name = $1;
- my $ctx_before = substr($line, 0, $-[1]);
- my $ctx = "$ctx_before$name";
-
- if ($name =~ /^(?:
- if|for|while|switch|return|case|
- volatile|__volatile__|
- __attribute__|format|__extension__|
- asm|__asm__)$/x)
- {
-
-
-
- } elsif ($ctx_before =~ /^.\s*\#\s*define\s*$/) {
-
- } elsif ($ctx =~ /^.\s*\#\s*elif\s*$/) {
-
-
- } elsif ($ctx =~ /$Type$/) {
- } else {
- if (WARN("SPACING",
- "space prohibited between function name and open parenthesis '('\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~
- s/\b$name\s+\(/$name\(/;
- }
- }
- }
- if (!($line=~/\#\s*include/)) {
- my $fixed_line = "";
- my $line_fixed = 0;
- my $ops = qr{
- <<=|>>=|<=|>=|==|!=|
- \+=|-=|\*=|\/=|%=|\^=|\|=|&=|
- =>|->|<<|>>|<|>|=|!|~|
- &&|\|\||,|\^|\+\+|--|&|\||\+|-|\*|\/|%|
- \?:|\?|:
- }x;
- my @elements = split(/($ops|;)/, $opline);
- my @fix_elements = ();
- my $off = 0;
- foreach my $el (@elements) {
- push(@fix_elements, substr($rawline, $off, length($el)));
- $off += length($el);
- }
- $off = 0;
- my $blank = copy_spacing($opline);
- my $last_after = -1;
- for (my $n = 0; $n < $#elements; $n += 2) {
- my $good = $fix_elements[$n] . $fix_elements[$n + 1];
- $off += length($elements[$n]);
-
- my $ca = substr($opline, 0, $off);
- my $cc = '';
- if (length($opline) >= ($off + length($elements[$n + 1]))) {
- $cc = substr($opline, $off + length($elements[$n + 1]));
- }
- my $cb = "$ca$;$cc";
- my $a = '';
- $a = 'V' if ($elements[$n] ne '');
- $a = 'W' if ($elements[$n] =~ /\s$/);
- $a = 'C' if ($elements[$n] =~ /$;$/);
- $a = 'B' if ($elements[$n] =~ /(\[|\()$/);
- $a = 'O' if ($elements[$n] eq '');
- $a = 'E' if ($ca =~ /^\s*$/);
- my $op = $elements[$n + 1];
- my $c = '';
- if (defined $elements[$n + 2]) {
- $c = 'V' if ($elements[$n + 2] ne '');
- $c = 'W' if ($elements[$n + 2] =~ /^\s/);
- $c = 'C' if ($elements[$n + 2] =~ /^$;/);
- $c = 'B' if ($elements[$n + 2] =~ /^(\)|\]|;)/);
- $c = 'O' if ($elements[$n + 2] eq '');
- $c = 'E' if ($elements[$n + 2] =~ /^\s*\\$/);
- } else {
- $c = 'E';
- }
- my $ctx = "${a}x${c}";
- my $at = "(ctx:$ctx)";
- my $ptr = substr($blank, 0, $off) . "^";
- my $hereptr = "$hereline$ptr\n";
-
- my $op_type = substr($curr_values, $off + 1, 1);
-
- my $opv = $op . substr($curr_vars, $off, 1);
-
- if ($op_type ne 'V' &&
- $ca =~ /\s$/ && $cc =~ /^\s*[,\)]/) {
-
- } elsif ($op eq ';') {
- if ($ctx !~ /.x[WEBC]/ &&
- $cc !~ /^\\/ && $cc !~ /^;/) {
- if (ERROR("SPACING",
- "space required after that '$op' $at\n" . $hereptr)) {
- $good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
- $line_fixed = 1;
- }
- }
-
- } elsif ($op eq '//') {
-
- } elsif ($opv eq ':B') {
-
-
-
- } elsif ($op eq '->') {
- if ($ctx =~ /Wx.|.xW/) {
- if (ERROR("SPACING",
- "spaces prohibited around that '$op' $at\n" . $hereptr)) {
- $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
- if (defined $fix_elements[$n + 2]) {
- $fix_elements[$n + 2] =~ s/^\s+//;
- }
- $line_fixed = 1;
- }
- }
-
- } elsif ($op eq ',') {
- my $rtrim_before = 0;
- my $space_after = 0;
- if ($ctx =~ /Wx./) {
- if (ERROR("SPACING",
- "space prohibited before that '$op' $at\n" . $hereptr)) {
- $line_fixed = 1;
- $rtrim_before = 1;
- }
- }
- if ($ctx !~ /.x[WEC]/ && $cc !~ /^}/ && $cc !~ /^\)/) {
- if (ERROR("SPACING",
- "space required after that '$op' $at\n" . $hereptr)) {
- $line_fixed = 1;
- $last_after = $n;
- $space_after = 1;
- }
- }
- if ($rtrim_before || $space_after) {
- if ($rtrim_before) {
- $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
- } else {
- $good = $fix_elements[$n] . trim($fix_elements[$n + 1]);
- }
- if ($space_after) {
- $good .= " ";
- }
- }
-
- } elsif ($opv eq '*_') {
-
-
-
-
- } elsif ($op eq '!' || $op eq '~' ||
- $opv eq '*U' || $opv eq '-U' ||
- $opv eq '&U' || $opv eq '&&U') {
- if ($ctx !~ /[WEBC]x./ && $ca !~ /(?:\)|!|~|\*|-|\&|\||\+\+|\-\-|\{)$/) {
- if (ERROR("SPACING",
- "space required before that '$op' $at\n" . $hereptr)) {
- if ($n != $last_after + 2) {
- $good = $fix_elements[$n] . " " . ltrim($fix_elements[$n + 1]);
- $line_fixed = 1;
- }
- }
- }
- if ($op eq '*' && $cc =~/\s*$Modifier\b/) {
-
- } elsif ($ctx =~ /.xW/) {
- if (ERROR("SPACING",
- "space prohibited after that '$op' $at\n" . $hereptr)) {
- $good = $fix_elements[$n] . rtrim($fix_elements[$n + 1]);
- if (defined $fix_elements[$n + 2]) {
- $fix_elements[$n + 2] =~ s/^\s+//;
- }
- $line_fixed = 1;
- }
- }
-
- } elsif ($op eq '++' or $op eq '--') {
- if ($ctx !~ /[WEOBC]x[^W]/ && $ctx !~ /[^W]x[WOBEC]/) {
- if (ERROR("SPACING",
- "space required one side of that '$op' $at\n" . $hereptr)) {
- $good = $fix_elements[$n] . trim($fix_elements[$n + 1]) . " ";
- $line_fixed = 1;
- }
- }
- if ($ctx =~ /Wx[BE]/ ||
- ($ctx =~ /Wx./ && $cc =~ /^;/)) {
- if (ERROR("SPACING",
- "space prohibited before that '$op' $at\n" . $hereptr)) {
- $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
- $line_fixed = 1;
- }
- }
- if ($ctx =~ /ExW/) {
- if (ERROR("SPACING",
- "space prohibited after that '$op' $at\n" . $hereptr)) {
- $good = $fix_elements[$n] . trim($fix_elements[$n + 1]);
- if (defined $fix_elements[$n + 2]) {
- $fix_elements[$n + 2] =~ s/^\s+//;
- }
- $line_fixed = 1;
- }
- }
-
- } elsif ($op eq '<<' or $op eq '>>' or
- $op eq '&' or $op eq '^' or $op eq '|' or
- $op eq '+' or $op eq '-' or
- $op eq '*' or $op eq '/' or
- $op eq '%')
- {
- if ($check) {
- if (defined $fix_elements[$n + 2] && $ctx !~ /[EW]x[EW]/) {
- if (CHK("SPACING",
- "spaces preferred around that '$op' $at\n" . $hereptr)) {
- $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
- $fix_elements[$n + 2] =~ s/^\s+//;
- $line_fixed = 1;
- }
- } elsif (!defined $fix_elements[$n + 2] && $ctx !~ /Wx[OE]/) {
- if (CHK("SPACING",
- "space preferred before that '$op' $at\n" . $hereptr)) {
- $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]);
- $line_fixed = 1;
- }
- }
- } elsif ($ctx =~ /Wx[^WCE]|[^WCE]xW/) {
- if (ERROR("SPACING",
- "need consistent spacing around '$op' $at\n" . $hereptr)) {
- $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
- if (defined $fix_elements[$n + 2]) {
- $fix_elements[$n + 2] =~ s/^\s+//;
- }
- $line_fixed = 1;
- }
- }
-
-
- } elsif ($opv eq ':C' || $opv eq ':L') {
- if ($ctx =~ /Wx./) {
- if (ERROR("SPACING",
- "space prohibited before that '$op' $at\n" . $hereptr)) {
- $good = rtrim($fix_elements[$n]) . trim($fix_elements[$n + 1]);
- $line_fixed = 1;
- }
- }
-
- } elsif ($ctx !~ /[EWC]x[CWE]/) {
- my $ok = 0;
-
- if (($op eq '<' &&
- $cc =~ /^\S+\@\S+>/) ||
- ($op eq '>' &&
- $ca =~ /<\S+\@\S+$/))
- {
- $ok = 1;
- }
-
-
-
- if (($op eq ':') &&
- ($ca =~ /:$/ || $cc =~ /^:/)) {
- $ok = 1;
- }
-
- if ($ok == 0) {
- my $msg_level = \&ERROR;
- $msg_level = \&CHK if (($op eq '?:' || $op eq '?' || $op eq ':') && $ctx =~ /VxV/);
- if (&{$msg_level}("SPACING",
- "spaces required around that '$op' $at\n" . $hereptr)) {
- $good = rtrim($fix_elements[$n]) . " " . trim($fix_elements[$n + 1]) . " ";
- if (defined $fix_elements[$n + 2]) {
- $fix_elements[$n + 2] =~ s/^\s+//;
- }
- $line_fixed = 1;
- }
- }
- }
- $off += length($elements[$n + 1]);
- $fixed_line = $fixed_line . $good;
- }
- if (($#elements % 2) == 0) {
- $fixed_line = $fixed_line . $fix_elements[$#elements];
- }
- if ($fix && $line_fixed && $fixed_line ne $fixed[$fixlinenr]) {
- $fixed[$fixlinenr] = $fixed_line;
- }
- }
- if ($line =~ /^\+.*\S\s+;\s*$/) {
- if (WARN("SPACING",
- "space prohibited before semicolon\n" . $herecurr) &&
- $fix) {
- 1 while $fixed[$fixlinenr] =~
- s/^(\+.*\S)\s+;/$1;/;
- }
- }
- if ($line =~ /^.\s*$Lval\s*=\s*$Lval\s*=(?!=)/) {
- CHK("MULTIPLE_ASSIGNMENTS",
- "multiple assignments should be avoided\n" . $herecurr);
- }
- if (($line =~ /\(.*\)\{/ && $line !~ /\($Type\)\{/) ||
- $line =~ /\b(?:else|do)\{/) {
- if (ERROR("SPACING",
- "space required before the open brace '{'\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~ s/^(\+.*(?:do|else|\)))\{/$1 {/;
- }
- }
- if ($line =~ /}(?!(?:,|;|\)|\}))\S/) {
- if (ERROR("SPACING",
- "space required after that close brace '}'\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~
- s/}((?!(?:,|;|\)))\S)/} $1/;
- }
- }
- if ($line =~ /\[\s/ && $line !~ /\[\s*$/) {
- if (ERROR("SPACING",
- "space prohibited after that open square bracket '['\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~
- s/\[\s+/\[/;
- }
- }
- if ($line =~ /\s\]/) {
- if (ERROR("SPACING",
- "space prohibited before that close square bracket ']'\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~
- s/\s+\]/\]/;
- }
- }
- if ($line =~ /\(\s/ && $line !~ /\(\s*(?:\\)?$/ &&
- $line !~ /for\s*\(\s+;/) {
- if (ERROR("SPACING",
- "space prohibited after that open parenthesis '('\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~
- s/\(\s+/\(/;
- }
- }
- if ($line =~ /(\s+)\)/ && $line !~ /^.\s*\)/ &&
- $line !~ /for\s*\(.*;\s+\)/ &&
- $line !~ /:\s+\)/) {
- if (ERROR("SPACING",
- "space prohibited before that close parenthesis ')'\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~
- s/\s+\)/\)/;
- }
- }
- while ($line =~ /(?:[^&]&\s*|\*)\(\s*($Ident\s*(?:$Member\s*)+)\s*\)/g) {
- my $var = $1;
- if (CHK("UNNECESSARY_PARENTHESES",
- "Unnecessary parentheses around $var\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~ s/\(\s*\Q$var\E\s*\)/$var/;
- }
- }
- if ($line =~ /(\bif\s*|)(\(\s*$Ident\s*(?:$Member\s*)+\))[ \t]*\(/ && $1 !~ /^if/) {
- my $var = $2;
- if (CHK("UNNECESSARY_PARENTHESES",
- "Unnecessary parentheses around function pointer $var\n" . $herecurr) &&
- $fix) {
- my $var2 = deparenthesize($var);
- $var2 =~ s/\s//g;
- $fixed[$fixlinenr] =~ s/\Q$var\E/$var2/;
- }
- }
- if (($realfile !~ m@^(?:drivers/staging/)@ || $check_orig) &&
- $perl_version_ok && defined($stat) &&
- $stat =~ /(^.\s*if\s*($balanced_parens))/) {
- my $if_stat = $1;
- my $test = substr($2, 1, -1);
- my $herectx;
- while ($test =~ /(?:^|[^\w\&\!\~])+\s*\(\s*([\&\!\~]?\s*$Lval\s*(?:$Compare\s*$FuncArg)?)\s*\)/g) {
- my $match = $1;
-
- next if ($match =~ /^\s*\w+\s*$/);
- if (!defined($herectx)) {
- $herectx = $here . "\n";
- my $cnt = statement_rawlines($if_stat);
- for (my $n = 0; $n < $cnt; $n++) {
- my $rl = raw_line($linenr, $n);
- $herectx .= $rl . "\n";
- last if $rl =~ /^[ \+].*\{/;
- }
- }
- CHK("UNNECESSARY_PARENTHESES",
- "Unnecessary parentheses around '$match'\n" . $herectx);
- }
- }
- if ($line=~/^.\s+[A-Za-z\d_]+:(?![0-9]+)/ and
- !($line=~/^. [A-Za-z\d_]+:/) and !($line=~/^.\s+default:/)) {
- if (WARN("INDENTED_LABEL",
- "labels should not be indented\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~
- s/^(.)\s+/$1/;
- }
- }
- if (defined($stat) && $stat =~ /^.\s*return(\s*)\(/s) {
- my $spacing = $1;
- if ($perl_version_ok &&
- $stat =~ /^.\s*return\s*($balanced_parens)\s*;\s*$/) {
- my $value = $1;
- $value = deparenthesize($value);
- if ($value =~ m/^\s*$FuncArg\s*(?:\?|$)/) {
- ERROR("RETURN_PARENTHESES",
- "return is not a function, parentheses are not required\n" . $herecurr);
- }
- } elsif ($spacing !~ /\s+/) {
- ERROR("SPACING",
- "space required before the open parenthesis '('\n" . $herecurr);
- }
- }
- if ($sline =~ /^[ \+]}\s*$/ &&
- $prevline =~ /^\+\treturn\s*;\s*$/ &&
- $linenr >= 3 &&
- $lines[$linenr - 3] =~ /^[ +]/ &&
- $lines[$linenr - 3] !~ /^[ +]\s*$Ident\s*:/) {
- WARN("RETURN_VOID",
- "void function return statements are not generally useful\n" . $hereprev);
- }
- if ($perl_version_ok &&
- $line =~ /\bif\s*((?:\(\s*){2,})/) {
- my $openparens = $1;
- my $count = $openparens =~ tr@\(@\(@;
- my $msg = "";
- if ($line =~ /\bif\s*(?:\(\s*){$count,$count}$LvalOrFunc\s*($Compare)\s*$LvalOrFunc(?:\s*\)){$count,$count}/) {
- my $comp = $4;
- $msg = " - maybe == should be = ?" if ($comp eq "==");
- WARN("UNNECESSARY_PARENTHESES",
- "Unnecessary parentheses$msg\n" . $herecurr);
- }
- }
- if ($perl_version_ok &&
- $line =~ /^\+(.*)\b($Constant|[A-Z_][A-Z0-9_]*)\s*($Compare)\s*($LvalOrFunc)/) {
- my $lead = $1;
- my $const = $2;
- my $comp = $3;
- my $to = $4;
- my $newcomp = $comp;
- if ($lead !~ /(?:$Operators|\.)\s*$/ &&
- $to !~ /^(?:Constant|[A-Z_][A-Z0-9_]*)$/ &&
- WARN("CONSTANT_COMPARISON",
- "Comparisons should place the constant on the right side of the test\n" . $herecurr) &&
- $fix) {
- if ($comp eq "<") {
- $newcomp = ">";
- } elsif ($comp eq "<=") {
- $newcomp = ">=";
- } elsif ($comp eq ">") {
- $newcomp = "<";
- } elsif ($comp eq ">=") {
- $newcomp = "<=";
- }
- $fixed[$fixlinenr] =~ s/\(\s*\Q$const\E\s*$Compare\s*\Q$to\E\s*\)/($to $newcomp $const)/;
- }
- }
- if ($sline =~ /\breturn(?:\s*\(+\s*|\s+)(E[A-Z]+)(?:\s*\)+\s*|\s*)[;:,]/) {
- my $name = $1;
- if ($name ne 'EOF' && $name ne 'ERROR') {
- WARN("USE_NEGATIVE_ERRNO",
- "return of an errno should typically be negative (ie: return -$1)\n" . $herecurr);
- }
- }
- if ($line =~ /\b(if|while|for|switch)\(/) {
- if (ERROR("SPACING",
- "space required before the open parenthesis '('\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~
- s/\b(if|while|for|switch)\(/$1 \(/;
- }
- }
- if ($line =~ /do\s*(?!{)/) {
- ($stat, $cond, $line_nr_next, $remain_next, $off_next) =
- ctx_statement_block($linenr, $realcnt, 0)
- if (!defined $stat);
- my ($stat_next) = ctx_statement_block($line_nr_next,
- $remain_next, $off_next);
- $stat_next =~ s/\n./\n /g;
-
- if ($stat_next =~ /^\s*while\b/) {
-
-
- my ($whitespace) =
- ($stat_next =~ /^((?:\s*\n[+-])*\s*)/s);
- my $offset =
- statement_rawlines($whitespace) - 1;
- $suppress_whiletrailers{$line_nr_next +
- $offset} = 1;
- }
- }
- if (!defined $suppress_whiletrailers{$linenr} &&
- defined($stat) && defined($cond) &&
- $line =~ /\b(?:if|while|for)\s*\(/ && $line !~ /^.\s*#/) {
- my ($s, $c) = ($stat, $cond);
- if ($c =~ /\bif\s*\(.*[^<>!=]=[^=].*/s) {
- if (ERROR("ASSIGN_IN_IF",
- "do not use assignment in if condition\n" . $herecurr) &&
- $fix && $perl_version_ok) {
- if ($rawline =~ /^\+(\s+)if\s*\(\s*(\!)?\s*\(\s*(($Lval)\s*=\s*$LvalOrFunc)\s*\)\s*(?:($Compare)\s*($FuncArg))?\s*\)\s*(\{)?\s*$/) {
- my $space = $1;
- my $not = $2;
- my $statement = $3;
- my $assigned = $4;
- my $test = $8;
- my $against = $9;
- my $brace = $15;
- fix_delete_line($fixlinenr, $rawline);
- fix_insert_line($fixlinenr, "$space$statement;");
- my $newline = "${space}if (";
- $newline .= '!' if defined($not);
- $newline .= '(' if (defined $not && defined($test) && defined($against));
- $newline .= "$assigned";
- $newline .= " $test $against" if (defined($test) && defined($against));
- $newline .= ')' if (defined $not && defined($test) && defined($against));
- $newline .= ')';
- $newline .= " {" if (defined($brace));
- fix_insert_line($fixlinenr + 1, $newline);
- }
- }
- }
-
-
- substr($s, 0, length($c), '');
- $s =~ s/\n.*//g;
- $s =~ s/$;//g;
- if (length($c) && $s !~ /^\s*{?\s*\\*\s*$/ &&
- $c !~ /}\s*while\s*/)
- {
-
- my @newlines = ($c =~ /\n/gs);
- my $cond_lines = 1 + $#newlines;
- my $stat_real = '';
- $stat_real = raw_line($linenr, $cond_lines)
- . "\n" if ($cond_lines);
- if (defined($stat_real) && $cond_lines > 1) {
- $stat_real = "[...]\n$stat_real";
- }
- ERROR("TRAILING_STATEMENTS",
- "trailing statements should be on next line\n" . $herecurr . $stat_real);
- }
- }
- if ($line =~ /
- (?:
- (?:\[|\(|\&\&|\|\|)
- \s*0[xX][0-9]+\s*
- (?:\&\&|\|\|)
- |
- (?:\&\&|\|\|)
- \s*0[xX][0-9]+\s*
- (?:\&\&|\|\||\)|\])
- )/x)
- {
- WARN("HEXADECIMAL_BOOLEAN_TEST",
- "boolean test with hexadecimal, perhaps just 1 \& or \|?\n" . $herecurr);
- }
- if ($line =~ /^.\s*(?:}\s*)?else\b(.*)/) {
- my $s = $1;
- $s =~ s/$;//g;
- if ($s !~ /^\s*(?:\sif|(?:{|)\s*\\?\s*$)/) {
- ERROR("TRAILING_STATEMENTS",
- "trailing statements should be on next line\n" . $herecurr);
- }
- }
- if ($line =~ /}\s*if\b/) {
- ERROR("TRAILING_STATEMENTS",
- "trailing statements should be on next line (or did you mean 'else if'?)\n" .
- $herecurr);
- }
- if ($line =~ /^.\s*(?:case\s*.*|default\s*):/g &&
- $line !~ /\G(?:
- (?:\s*$;*)(?:\s*{)?(?:\s*$;*)(?:\s*\\)?\s*$|
- \s*return\s+
- )/xg)
- {
- ERROR("TRAILING_STATEMENTS",
- "trailing statements should be on next line\n" . $herecurr);
- }
-
-
- if ($prevline=~/}\s*$/ and $line=~/^.\s*else\s*/ &&
- $previndent == $indent) {
- if (ERROR("ELSE_AFTER_BRACE",
- "else should follow close brace '}'\n" . $hereprev) &&
- $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
- fix_delete_line($fixlinenr - 1, $prevrawline);
- fix_delete_line($fixlinenr, $rawline);
- my $fixedline = $prevrawline;
- $fixedline =~ s/}\s*$//;
- if ($fixedline !~ /^\+\s*$/) {
- fix_insert_line($fixlinenr, $fixedline);
- }
- $fixedline = $rawline;
- $fixedline =~ s/^(.\s*)else/$1} else/;
- fix_insert_line($fixlinenr, $fixedline);
- }
- }
- if ($prevline=~/}\s*$/ and $line=~/^.\s*while\s*/ &&
- $previndent == $indent) {
- my ($s, $c) = ctx_statement_block($linenr, $realcnt, 0);
-
-
- substr($s, 0, length($c), '');
- $s =~ s/\n.*//g;
- if ($s =~ /^\s*;/) {
- if (ERROR("WHILE_AFTER_BRACE",
- "while should follow close brace '}'\n" . $hereprev) &&
- $fix && $prevline =~ /^\+/ && $line =~ /^\+/) {
- fix_delete_line($fixlinenr - 1, $prevrawline);
- fix_delete_line($fixlinenr, $rawline);
- my $fixedline = $prevrawline;
- my $trailing = $rawline;
- $trailing =~ s/^\+//;
- $trailing = trim($trailing);
- $fixedline =~ s/}\s*$/} $trailing/;
- fix_insert_line($fixlinenr, $fixedline);
- }
- }
- }
- while ($line =~ m{($Constant|$Lval)}g) {
- my $var = $1;
- if ($var !~ /^$Constant$/ &&
- $var =~ /[A-Z][a-z]|[a-z][A-Z]/ &&
- $var !~ /^(?:Clear|Set|TestClear|TestSet|)Page[A-Z]/ &&
- $var !~ /^(?:[a-z0-9_]*|[A-Z0-9_]*)?_?[a-z][A-Z](?:_[a-z0-9_]+|_[A-Z0-9_]+)?$/ &&
- $var !~ /^(?:[a-z_]*?)_?(?:[KMGT]iB|[KMGT]?Hz)(?:_[a-z_]+)?$/) {
- while ($var =~ m{($Ident)}g) {
- my $word = $1;
- next if ($word !~ /[A-Z][a-z]|[a-z][A-Z]/);
- if ($check) {
- seed_camelcase_includes();
- if (!$file && !$camelcase_file_seeded) {
- seed_camelcase_file($realfile);
- $camelcase_file_seeded = 1;
- }
- }
- if (!defined $camelcase{$word}) {
- $camelcase{$word} = 1;
- CHK("CAMELCASE",
- "Avoid CamelCase: <$word>\n" . $herecurr);
- }
- }
- }
- }
- if ($line =~ /\#\s*define.*\\\s+$/) {
- if (WARN("WHITESPACE_AFTER_LINE_CONTINUATION",
- "Whitespace after \\ makes next lines useless\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~ s/\s+$//;
- }
- }
- if ($tree && $rawline =~ m{^.\s*\
- my $file = "$1.h";
- my $checkfile = "include/linux/$file";
- if (-f "$root/$checkfile" &&
- $realfile ne $checkfile &&
- $1 !~ /$allowed_asm_includes/)
- {
- my $asminclude = `grep -Ec "#include\\s+<asm/$file>" $root/$checkfile`;
- if ($asminclude > 0) {
- if ($realfile =~ m{^arch/}) {
- CHK("ARCH_INCLUDE_LINUX",
- "Consider using #include <linux/$file> instead of <asm/$file>\n" . $herecurr);
- } else {
- WARN("INCLUDE_LINUX",
- "Use #include <linux/$file> instead of <asm/$file>\n" . $herecurr);
- }
- }
- }
- }
- if ($realfile !~ m@/vmlinux.lds.h$@ &&
- $line =~ /^.\s*\#\s*define\s*$Ident(\()?/) {
- my $ln = $linenr;
- my $cnt = $realcnt;
- my ($off, $dstat, $dcond, $rest);
- my $ctx = '';
- my $has_flow_statement = 0;
- my $has_arg_concat = 0;
- ($dstat, $dcond, $ln, $cnt, $off) =
- ctx_statement_block($linenr, $realcnt, 0);
- $ctx = $dstat;
-
-
- $has_flow_statement = 1 if ($ctx =~ /\b(goto|return)\b/);
- $has_arg_concat = 1 if ($ctx =~ /\#\#/ && $ctx !~ /\#\#\s*(?:__VA_ARGS__|args)\b/);
- $dstat =~ s/^.\s*\#\s*define\s+$Ident(\([^\)]*\))?\s*//;
- my $define_args = $1;
- my $define_stmt = $dstat;
- my @def_args = ();
- if (defined $define_args && $define_args ne "") {
- $define_args = substr($define_args, 1, length($define_args) - 2);
- $define_args =~ s/\s*//g;
- $define_args =~ s/\\\+?//g;
- @def_args = split(",", $define_args);
- }
- $dstat =~ s/$;//g;
- $dstat =~ s/\\\n.//g;
- $dstat =~ s/^\s*//s;
- $dstat =~ s/\s*$//s;
-
- while ($dstat =~ s/\([^\(\)]*\)/1/ ||
- $dstat =~ s/\{[^\{\}]*\}/1/ ||
- $dstat =~ s/.\[[^\[\]]*\]/1/)
- {
- }
-
- while ($dstat =~ s/($String)\s*$Ident/$1/ ||
- $dstat =~ s/$Ident\s*($String)/$1/)
- {
- }
-
- $dstat =~ s/\b_*asm_*\s+_*volatile_*\b/asm_volatile/g;
- my $exceptions = qr{
- $Declare|
- module_param_named|
- MODULE_PARM_DESC|
- DECLARE_PER_CPU|
- DEFINE_PER_CPU|
- __typeof__\(|
- union|
- struct|
- \.$Ident\s*=\s*|
- ^\"|\"$|
- ^\[
- }x;
-
- $ctx =~ s/\n*$//;
- my $stmt_cnt = statement_rawlines($ctx);
- my $herectx = get_stat_here($linenr, $stmt_cnt, $here);
- if ($dstat ne '' &&
- $dstat !~ /^(?:$Ident|-?$Constant),$/ &&
- $dstat !~ /^(?:$Ident|-?$Constant);$/ &&
- $dstat !~ /^[!~-]?(?:$Lval|$Constant)$/ &&
- $dstat !~ /^'X'$/ && $dstat !~ /^'XX'$/ &&
- $dstat !~ /$exceptions/ &&
- $dstat !~ /^\.$Ident\s*=/ &&
- $dstat !~ /^(?:\#\s*$Ident|\#\s*$Constant)\s*$/ &&
- $dstat !~ /^do\s*$Constant\s*while\s*$Constant;?$/ &&
- $dstat !~ /^for\s*$Constant$/ &&
- $dstat !~ /^for\s*$Constant\s+(?:$Ident|-?$Constant)$/ &&
- $dstat !~ /^do\s*{/ &&
- $dstat !~ /^\(\{/ &&
- $ctx !~ /^.\s*#\s*define\s+TRACE_(?:SYSTEM|INCLUDE_FILE|INCLUDE_PATH)\b/)
- {
- if ($dstat =~ /^\s*if\b/) {
- ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE",
- "Macros starting with if should be enclosed by a do - while loop to avoid possible if/else logic defects\n" . "$herectx");
- } elsif ($dstat =~ /;/) {
- ERROR("MULTISTATEMENT_MACRO_USE_DO_WHILE",
- "Macros with multiple statements should be enclosed in a do - while loop\n" . "$herectx");
- } else {
- WARN("COMPLEX_MACRO",
- "Macros with complex values should be enclosed in parentheses\n" . "$herectx");
- }
- }
-
- my @stmt_array = split('\n', $define_stmt);
- my $first = 1;
- $define_stmt = "";
- foreach my $l (@stmt_array) {
- $l =~ s/\\$//;
- if ($first) {
- $define_stmt = $l;
- $first = 0;
- } elsif ($l =~ /^[\+ ]/) {
- $define_stmt .= substr($l, 1);
- }
- }
- $define_stmt =~ s/$;//g;
- $define_stmt =~ s/\s+/ /g;
- $define_stmt = trim($define_stmt);
- foreach my $arg (@def_args) {
- next if ($arg =~ /\.\.\./);
- next if ($arg =~ /^type$/i);
- my $tmp_stmt = $define_stmt;
- $tmp_stmt =~ s/\b(sizeof|typeof|__typeof__|__builtin\w+|typecheck\s*\(\s*$Type\s*,|\#+)\s*\(*\s*$arg\s*\)*\b//g;
- $tmp_stmt =~ s/\#+\s*$arg\b//g;
- $tmp_stmt =~ s/\b$arg\s*\#\#//g;
- my $use_cnt = () = $tmp_stmt =~ /\b$arg\b/g;
- if ($use_cnt > 1) {
- CHK("MACRO_ARG_REUSE",
- "Macro argument reuse '$arg' - possible side-effects?\n" . "$herectx");
- }
- if ($tmp_stmt =~ m/($Operators)?\s*\b$arg\b\s*($Operators)?/m &&
- ((defined($1) && $1 ne ',') ||
- (defined($2) && $2 ne ','))) {
- CHK("MACRO_ARG_PRECEDENCE",
- "Macro argument '$arg' may be better as '($arg)' to avoid precedence issues\n" . "$herectx");
- }
- }
- if ($has_flow_statement && !$has_arg_concat) {
- my $cnt = statement_rawlines($ctx);
- my $herectx = get_stat_here($linenr, $cnt, $here);
- WARN("MACRO_WITH_FLOW_CONTROL",
- "Macros with flow control statements should be avoided\n" . "$herectx");
- }
- } else {
- if ($prevline !~ /^..*\\$/ &&
- $line !~ /^\+\s*\#.*\\$/ &&
- $line !~ /^\+.*\b(__asm__|asm)\b.*\\$/ &&
- $line =~ /^\+.*\\$/) {
- WARN("LINE_CONTINUATIONS",
- "Avoid unnecessary line continuations\n" . $herecurr);
- }
- }
- if ($perl_version_ok &&
- $realfile !~ m@/vmlinux.lds.h$@ &&
- $line =~ /^.\s*\#\s*define\s+$Ident(\()?/) {
- my $ln = $linenr;
- my $cnt = $realcnt;
- my ($off, $dstat, $dcond, $rest);
- my $ctx = '';
- ($dstat, $dcond, $ln, $cnt, $off) =
- ctx_statement_block($linenr, $realcnt, 0);
- $ctx = $dstat;
- $dstat =~ s/\\\n.//g;
- $dstat =~ s/$;/ /g;
- if ($dstat =~ /^\+\s*#\s*define\s+$Ident\s*${balanced_parens}\s*do\s*{(.*)\s*}\s*while\s*\(\s*0\s*\)\s*([;\s]*)\s*$/) {
- my $stmts = $2;
- my $semis = $3;
- $ctx =~ s/\n*$//;
- my $cnt = statement_rawlines($ctx);
- my $herectx = get_stat_here($linenr, $cnt, $here);
- if (($stmts =~ tr/;/;/) == 1 &&
- $stmts !~ /^\s*(if|while|for|switch)\b/) {
- WARN("SINGLE_STATEMENT_DO_WHILE_MACRO",
- "Single statement macros should not use a do {} while (0) loop\n" . "$herectx");
- }
- if (defined $semis && $semis ne "") {
- WARN("DO_WHILE_MACRO_WITH_TRAILING_SEMICOLON",
- "do {} while (0) macros should not be semicolon terminated\n" . "$herectx");
- }
- } elsif ($dstat =~ /^\+\s*#\s*define\s+$Ident.*;\s*$/) {
- $ctx =~ s/\n*$//;
- my $cnt = statement_rawlines($ctx);
- my $herectx = get_stat_here($linenr, $cnt, $here);
- WARN("TRAILING_SEMICOLON",
- "macros should not use a trailing semicolon\n" . "$herectx");
- }
- }
- if ($line =~ /(^.*)\bif\b/ && $1 !~ /else\s*$/) {
- my ($level, $endln, @chunks) =
- ctx_statement_full($linenr, $realcnt, 1);
-
-
- if ($#chunks > 0 && $level == 0) {
- my @allowed = ();
- my $allow = 0;
- my $seen = 0;
- my $herectx = $here . "\n";
- my $ln = $linenr - 1;
- for my $chunk (@chunks) {
- my ($cond, $block) = @{$chunk};
-
- my ($whitespace) = ($cond =~ /^((?:\s*\n[+-])*\s*)/s);
- my $offset = statement_rawlines($whitespace) - 1;
- $allowed[$allow] = 0;
-
-
- $suppress_ifbraces{$ln + $offset} = 1;
- $herectx .= "$rawlines[$ln + $offset]\n[...]\n";
- $ln += statement_rawlines($block) - 1;
- substr($block, 0, length($cond), '');
- $seen++ if ($block =~ /^\s*{/);
-
- if (statement_lines($cond) > 1) {
-
- $allowed[$allow] = 1;
- }
- if ($block =~/\b(?:if|for|while)\b/) {
-
- $allowed[$allow] = 1;
- }
- if (statement_block_size($block) > 1) {
-
- $allowed[$allow] = 1;
- }
- $allow++;
- }
- if ($seen) {
- my $sum_allowed = 0;
- foreach (@allowed) {
- $sum_allowed += $_;
- }
- if ($sum_allowed == 0) {
- WARN("BRACES",
- "braces {} are not necessary for any arm of this statement\n" . $herectx);
- } elsif ($sum_allowed != $allow &&
- $seen != $allow) {
- CHK("BRACES",
- "braces {} should be used on all arms of this statement\n" . $herectx);
- }
- }
- }
- }
- if (!defined $suppress_ifbraces{$linenr - 1} &&
- $line =~ /\b(if|while|for|else)\b/) {
- my $allowed = 0;
-
- if (substr($line, 0, $-[0]) =~ /(\}\s*)$/) {
-
- $allowed = 1;
- }
- my ($level, $endln, @chunks) =
- ctx_statement_full($linenr, $realcnt, $-[0]);
-
- my ($cond, $block) = @{$chunks[0]};
-
- if (defined $cond) {
- substr($block, 0, length($cond), '');
- }
- if (statement_lines($cond) > 1) {
-
- $allowed = 1;
- }
- if ($block =~/\b(?:if|for|while)\b/) {
-
- $allowed = 1;
- }
- if (statement_block_size($block) > 1) {
-
- $allowed = 1;
- }
-
- if (defined $chunks[1]) {
- my ($cond, $block) = @{$chunks[1]};
- if (defined $cond) {
- substr($block, 0, length($cond), '');
- }
- if ($block =~ /^\s*\{/) {
-
- $allowed = 1;
- }
- }
- if ($level == 0 && $block =~ /^\s*\{/ && !$allowed) {
- my $cnt = statement_rawlines($block);
- my $herectx = get_stat_here($linenr, $cnt, $here);
- WARN("BRACES",
- "braces {} are not necessary for single statement blocks\n" . $herectx);
- }
- }
- if ($sline =~ /^.\s*\}\s*else\s*$/ ||
- $sline =~ /^.\s*else\s*\{\s*$/) {
- CHK("BRACES", "Unbalanced braces around else statement\n" . $herecurr);
- }
- if (($line =~ /^.\s*}\s*$/ && $prevrawline =~ /^.\s*$/)) {
- if (CHK("BRACES",
- "Blank lines aren't necessary before a close brace '}'\n" . $hereprev) &&
- $fix && $prevrawline =~ /^\+/) {
- fix_delete_line($fixlinenr - 1, $prevrawline);
- }
- }
- if (($rawline =~ /^.\s*$/ && $prevline =~ /^..*{\s*$/)) {
- if (CHK("BRACES",
- "Blank lines aren't necessary after an open brace '{'\n" . $hereprev) &&
- $fix) {
- fix_delete_line($fixlinenr, $rawline);
- }
- }
- my $asm_volatile = qr{\b(__asm__|asm)\s+(__volatile__|volatile)\b};
- if ($line =~ /\bvolatile\b/ && $line !~ /$asm_volatile/) {
- WARN("VOLATILE",
- "Use of volatile is usually wrong: see Documentation/process/volatile-considered-harmful.rst\n" . $herecurr);
- }
- if ($line =~ /^\+\s*$String/ &&
- $prevline =~ /"\s*$/ &&
- $prevrawline !~ /(?:\\(?:[ntr]|[0-7]{1,3}|x[0-9a-fA-F]{1,2})|;\s*|\{\s*)"\s*$/) {
- if (WARN("SPLIT_STRING",
- "quoted string split across lines\n" . $hereprev) &&
- $fix &&
- $prevrawline =~ /^\+.*"\s*$/ &&
- $last_coalesced_string_linenr != $linenr - 1) {
- my $extracted_string = get_quoted_string($line, $rawline);
- my $comma_close = "";
- if ($rawline =~ /\Q$extracted_string\E(\s*\)\s*;\s*$|\s*,\s*)/) {
- $comma_close = $1;
- }
- fix_delete_line($fixlinenr - 1, $prevrawline);
- fix_delete_line($fixlinenr, $rawline);
- my $fixedline = $prevrawline;
- $fixedline =~ s/"\s*$//;
- $fixedline .= substr($extracted_string, 1) . trim($comma_close);
- fix_insert_line($fixlinenr - 1, $fixedline);
- $fixedline = $rawline;
- $fixedline =~ s/\Q$extracted_string\E\Q$comma_close\E//;
- if ($fixedline !~ /\+\s*$/) {
- fix_insert_line($fixlinenr, $fixedline);
- }
- $last_coalesced_string_linenr = $linenr;
- }
- }
- if ($prevrawline =~ /[^\\]\w"$/ && $rawline =~ /^\+[\t ]+"\w/) {
- WARN('MISSING_SPACE',
- "break quoted strings at a space character\n" . $hereprev);
- }
- if ($line =~ /^\+.*$String/ &&
- defined($context_function) &&
- get_quoted_string($line, $rawline) =~ /\b$context_function\b/ &&
- length(get_quoted_string($line, $rawline)) != (length($context_function) + 2)) {
- WARN("EMBEDDED_FUNCTION_NAME",
- "Prefer using '\"%s...\", __func__' to using '$context_function', this function's name, in a string\n" . $herecurr);
- }
- if ($rawline =~ /^.*\".*\s\\n/) {
- if (WARN("QUOTED_WHITESPACE_BEFORE_NEWLINE",
- "unnecessary whitespace before a quoted newline\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~ s/^(\+.*\".*)\s+\\n/$1\\n/;
- }
- }
- if ($line =~ /$String[A-Za-z0-9_]/ || $line =~ /[A-Za-z0-9_]$String/) {
- if (CHK("CONCATENATED_STRING",
- "Concatenated strings should use spaces between elements\n" . $herecurr) &&
- $fix) {
- while ($line =~ /($String)/g) {
- my $extracted_string = substr($rawline, $-[0], $+[0] - $-[0]);
- $fixed[$fixlinenr] =~ s/\Q$extracted_string\E([A-Za-z0-9_])/$extracted_string $1/;
- $fixed[$fixlinenr] =~ s/([A-Za-z0-9_])\Q$extracted_string\E/$1 $extracted_string/;
- }
- }
- }
- if ($line =~ /$String\s*"/) {
- if (WARN("STRING_FRAGMENTS",
- "Consecutive strings are generally better as a single string\n" . $herecurr) &&
- $fix) {
- while ($line =~ /($String)(?=\s*")/g) {
- my $extracted_string = substr($rawline, $-[0], $+[0] - $-[0]);
- $fixed[$fixlinenr] =~ s/\Q$extracted_string\E\s*"/substr($extracted_string, 0, -1)/e;
- }
- }
- }
- my $show_L = 1;
- my $show_Z = 1;
- while ($line =~ /(?:^|")([X\t]*)(?:"|$)/g) {
- my $string = substr($rawline, $-[1], $+[1] - $-[1]);
- $string =~ s/%%/__/g;
-
- if ($show_L && $string =~ /%[\*\d\.\$]*L([diouxX])/) {
- WARN("PRINTF_L",
- "\%L$1 is non-standard C, use %ll$1\n" . $herecurr);
- $show_L = 0;
- }
-
- if ($show_Z && $string =~ /%[\*\d\.\$]*Z([diouxX])/) {
- WARN("PRINTF_Z",
- "%Z$1 is non-standard C, use %z$1\n" . $herecurr);
- $show_Z = 0;
- }
-
- if ($string =~ /0x%[\*\d\.\$\Llzth]*[diou]/) {
- ERROR("PRINTF_0XDECIMAL",
- "Prefixing 0x with decimal output is defective\n" . $herecurr);
- }
- }
- if ($rawline =~ /\\$/ && $sline =~ tr/"/"/ % 2) {
- WARN("LINE_CONTINUATIONS",
- "Avoid line continuations in quoted strings\n" . $herecurr);
- }
- if ($line =~ /^.\s*\#\s*if\s+0\b/) {
- WARN("IF_0",
- "Consider removing the code enclosed by this #if 0 and its #endif\n" . $herecurr);
- }
- if ($line =~ /^.\s*\#\s*if\s+1\b/) {
- WARN("IF_1",
- "Consider removing the #if 1 and its #endif\n" . $herecurr);
- }
- if ($prevline =~ /\bif\s*\(\s*($Lval)\s*\)/) {
- my $tested = quotemeta($1);
- my $expr = '\s*\(\s*' . $tested . '\s*\)\s*;';
- if ($line =~ /\b(kfree|usb_free_urb|debugfs_remove(?:_recursive)?|(?:kmem_cache|mempool|dma_pool)_destroy)$expr/) {
- my $func = $1;
- if (WARN('NEEDLESS_IF',
- "$func(NULL) is safe and this check is probably not required\n" . $hereprev) &&
- $fix) {
- my $do_fix = 1;
- my $leading_tabs = "";
- my $new_leading_tabs = "";
- if ($lines[$linenr - 2] =~ /^\+(\t*)if\s*\(\s*$tested\s*\)\s*$/) {
- $leading_tabs = $1;
- } else {
- $do_fix = 0;
- }
- if ($lines[$linenr - 1] =~ /^\+(\t+)$func\s*\(\s*$tested\s*\)\s*;\s*$/) {
- $new_leading_tabs = $1;
- if (length($leading_tabs) + 1 ne length($new_leading_tabs)) {
- $do_fix = 0;
- }
- } else {
- $do_fix = 0;
- }
- if ($do_fix) {
- fix_delete_line($fixlinenr - 1, $prevrawline);
- $fixed[$fixlinenr] =~ s/^\+$new_leading_tabs/\+$leading_tabs/;
- }
- }
- }
- }
- if ($line =~ /^\+.*\b$logFunctions\s*\(/ &&
- $prevline =~ /^[ \+]\s*if\s*\(\s*(\!\s*|NULL\s*==\s*)?($Lval)(\s*==\s*NULL\s*)?\s*\)/ &&
- (defined $1 || defined $3) &&
- $linenr > 3) {
- my $testval = $2;
- my $testline = $lines[$linenr - 3];
- my ($s, $c) = ctx_statement_block($linenr - 3, $realcnt, 0);
- if ($s =~ /(?:^|\n)[ \+]\s*(?:$Type\s*)?\Q$testval\E\s*=\s*(?:\([^\)]*\)\s*)?\s*$allocFunctions\s*\(/ &&
- $s !~ /\b__GFP_NOWARN\b/ ) {
- WARN("OOM_MESSAGE",
- "Possible unnecessary 'out of memory' message\n" . $hereprev);
- }
- }
- if ($line !~ /printk(?:_ratelimited|_once)?\s*\(/ &&
- $line =~ /\b$logFunctions\s*\(.*\b(KERN_[A-Z]+)\b/) {
- my $level = $1;
- if (WARN("UNNECESSARY_KERN_LEVEL",
- "Possible unnecessary $level\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~ s/\s*$level\s*//;
- }
- }
- if ($line =~ /\bprintk\s*\(\s*KERN_CONT\b|\bpr_cont\s*\(/) {
- WARN("LOGGING_CONTINUATION",
- "Avoid logging continuation uses where feasible\n" . $herecurr);
- }
- if ($perl_version_ok &&
- $line =~ /$LvalOrFunc\s*\&\s*($LvalOrFunc)\s*>>/ &&
- $4 !~ /^\&/) {
- WARN("MASK_THEN_SHIFT",
- "Possible precedence defect with mask then right shift - may need parentheses\n" . $herecurr);
- }
- if ($perl_version_ok) {
- while ($line =~ /\b$LvalOrFunc\s*(==|\!=)\s*NULL\b/g) {
- my $val = $1;
- my $equal = "!";
- $equal = "" if ($4 eq "!=");
- if (CHK("COMPARISON_TO_NULL",
- "Comparison to NULL could be written \"${equal}${val}\"\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~ s/\b\Q$val\E\s*(?:==|\!=)\s*NULL\b/$equal$val/;
- }
- }
- }
- if ($line =~ /(\b$InitAttribute\b)/) {
- my $attr = $1;
- if ($line =~ /^\+\s*static\s+(?:const\s+)?(?:$attr\s+)?($NonptrTypeWithAttr)\s+(?:$attr\s+)?($Ident(?:\[[^]]*\])?)\s*[=;]/) {
- my $ptr = $1;
- my $var = $2;
- if ((($ptr =~ /\b(union|struct)\s+$attr\b/ &&
- ERROR("MISPLACED_INIT",
- "$attr should be placed after $var\n" . $herecurr)) ||
- ($ptr !~ /\b(union|struct)\s+$attr\b/ &&
- WARN("MISPLACED_INIT",
- "$attr should be placed after $var\n" . $herecurr))) &&
- $fix) {
- $fixed[$fixlinenr] =~ s/(\bstatic\s+(?:const\s+)?)(?:$attr\s+)?($NonptrTypeWithAttr)\s+(?:$attr\s+)?($Ident(?:\[[^]]*\])?)\s*([=;])\s*/"$1" . trim(string_find_replace($2, "\\s*$attr\\s*", " ")) . " " . trim(string_find_replace($3, "\\s*$attr\\s*", "")) . " $attr" . ("$4" eq ";" ? ";" : " = ")/e;
- }
- }
- }
- if ($line =~ /\bconst\b/ && $line =~ /($InitAttributeData)/) {
- my $attr = $1;
- $attr =~ /($InitAttributePrefix)(.*)/;
- my $attr_prefix = $1;
- my $attr_type = $2;
- if (ERROR("INIT_ATTRIBUTE",
- "Use of const init definition must use ${attr_prefix}initconst\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~
- s/$InitAttributeData/${attr_prefix}initconst/;
- }
- }
- if ($line !~ /\bconst\b/ && $line =~ /($InitAttributeConst)/) {
- my $attr = $1;
- if (ERROR("INIT_ATTRIBUTE",
- "Use of $attr requires a separate use of const\n" . $herecurr) &&
- $fix) {
- my $lead = $fixed[$fixlinenr] =~
- /(^\+\s*(?:static\s+))/;
- $lead = rtrim($1);
- $lead = "$lead " if ($lead !~ /^\+$/);
- $lead = "${lead}const ";
- $fixed[$fixlinenr] =~ s/(^\+\s*(?:static\s+))/$lead/;
- }
- }
- if ($line =~ /\b__read_mostly\b/ &&
- $line =~ /($Type)\s*$Ident/ && $1 !~ /\*\s*$/ && $1 =~ /\bconst\b/) {
- if (ERROR("CONST_READ_MOSTLY",
- "Invalid use of __read_mostly with const type\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~ s/\s+__read_mostly\b//;
- }
- }
- if ($realfile !~ m@^include/uapi/@ &&
- $line =~ /(__constant_(?:htons|ntohs|[bl]e(?:16|32|64)_to_cpu|cpu_to_[bl]e(?:16|32|64)))\s*\(/) {
- my $constant_func = $1;
- my $func = $constant_func;
- $func =~ s/^__constant_//;
- if (WARN("CONSTANT_CONVERSION",
- "$constant_func should be $func\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~ s/\b$constant_func\b/$func/g;
- }
- }
- if ($line =~ /\budelay\s*\(\s*(\d+)\s*\)/) {
- my $delay = $1;
-
- if (! ($delay < 10) ) {
- CHK("USLEEP_RANGE",
- "usleep_range is preferred over udelay; see Documentation/timers/timers-howto.rst\n" . $herecurr);
- }
- if ($delay > 2000) {
- WARN("LONG_UDELAY",
- "long udelay - prefer mdelay; see arch/arm/include/asm/delay.h\n" . $herecurr);
- }
- }
- if ($line =~ /\bmsleep\s*\((\d+)\);/) {
- if ($1 < 20) {
- WARN("MSLEEP",
- "msleep < 20ms can sleep for up to 20ms; see Documentation/timers/timers-howto.rst\n" . $herecurr);
- }
- }
- if ($line =~ /\bjiffies\s*$Compare|$Compare\s*jiffies\b/) {
- WARN("JIFFIES_COMPARISON",
- "Comparing jiffies is almost always wrong; prefer time_after, time_before and friends\n" . $herecurr);
- }
- if ($line =~ /\bget_jiffies_64\s*\(\s*\)\s*$Compare|$Compare\s*get_jiffies_64\s*\(\s*\)/) {
- WARN("JIFFIES_COMPARISON",
- "Comparing get_jiffies_64() is almost always wrong; prefer time_after64, time_before64 and friends\n" . $herecurr);
- }
- if ($line =~ /^.\s*\#\s*(ifdef|ifndef|elif)\s\s+/) {
- if (ERROR("SPACING",
- "exactly one space required after that #$1\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~
- s/^(.\s*\#\s*(ifdef|ifndef|elif))\s{2,}/$1 /;
- }
- }
- if ($line =~ /^.\s*(struct\s+mutex|spinlock_t)\s+\S+;/ ||
- $line =~ /^.\s*(DEFINE_MUTEX)\s*\(/) {
- my $which = $1;
- if (!ctx_has_comment($first_line, $linenr)) {
- CHK("UNCOMMENTED_DEFINITION",
- "$1 definition without comment\n" . $herecurr);
- }
- }
- my $barriers = qr{
- mb|
- rmb|
- wmb
- }x;
- my $barrier_stems = qr{
- mb__before_atomic|
- mb__after_atomic|
- store_release|
- load_acquire|
- store_mb|
- (?:$barriers)
- }x;
- my $all_barriers = qr{
- (?:$barriers)|
- smp_(?:$barrier_stems)|
- virt_(?:$barrier_stems)
- }x;
- if ($line =~ /\b(?:$all_barriers)\s*\(/) {
- if (!ctx_has_comment($first_line, $linenr)) {
- WARN("MEMORY_BARRIER",
- "memory barrier without comment\n" . $herecurr);
- }
- }
- my $underscore_smp_barriers = qr{__smp_(?:$barrier_stems)}x;
- if ($realfile !~ m@^include/asm-generic/@ &&
- $realfile !~ m@/barrier\.h$@ &&
- $line =~ m/\b(?:$underscore_smp_barriers)\s*\(/ &&
- $line !~ m/^.\s*\#\s*define\s+(?:$underscore_smp_barriers)\s*\(/) {
- WARN("MEMORY_BARRIER",
- "__smp memory barriers shouldn't be used outside barrier.h and asm-generic\n" . $herecurr);
- }
- if ($line =~ /\bwaitqueue_active\s*\(/) {
- if (!ctx_has_comment($first_line, $linenr)) {
- WARN("WAITQUEUE_ACTIVE",
- "waitqueue_active without comment\n" . $herecurr);
- }
- }
- if ($line =~ /\bdata_race\s*\(/) {
- if (!ctx_has_comment($first_line, $linenr)) {
- WARN("DATA_RACE",
- "data_race without comment\n" . $herecurr);
- }
- }
- if ($line =~ m@^.\s*\
- CHK("ARCH_DEFINES",
- "architecture specific defines should be avoided\n" . $herecurr);
- }
- if ($line =~ /\b($Type)\s+($Storage)\b/) {
- WARN("STORAGE_CLASS",
- "storage class '$2' should be located before type '$1'\n" . $herecurr);
- }
- if ($line =~ /\b$Storage\b/ &&
- $line !~ /^.\s*$Storage/ &&
- $line =~ /^.\s*(.+?)\$Storage\s/ &&
- $1 !~ /[\,\)]\s*$/) {
- WARN("STORAGE_CLASS",
- "storage class should be at the beginning of the declaration\n" . $herecurr);
- }
- if ($line =~ /\b$Type\s+$Inline\b/ ||
- $line =~ /\b$Inline\s+$Storage\b/) {
- ERROR("INLINE_LOCATION",
- "inline keyword should sit between storage class and type\n" . $herecurr);
- }
- if ($realfile !~ m@\binclude/uapi/@ &&
- $line =~ /\b(__inline__|__inline)\b/) {
- if (WARN("INLINE",
- "plain inline is preferred over $1\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~ s/\b(__inline__|__inline)\b/inline/;
- }
- }
- if ($realfile !~ m@\binclude/uapi/@ &&
- $line =~ /\b__attribute__\s*\(\s*\(.*\bpacked\b/) {
- WARN("PREFER_PACKED",
- "__packed is preferred over __attribute__((packed))\n" . $herecurr);
- }
- if ($realfile !~ m@\binclude/uapi/@ &&
- $line =~ /\b__attribute__\s*\(\s*\(.*aligned/) {
- WARN("PREFER_ALIGNED",
- "__aligned(size) is preferred over __attribute__((aligned(size)))\n" . $herecurr);
- }
- if ($realfile !~ m@\binclude/uapi/@ &&
- $line =~ /\b__attribute__\s*\(\s*\(.*_*section_*\s*\(\s*("[^"]*")/) {
- my $old = substr($rawline, $-[1], $+[1] - $-[1]);
- my $new = substr($old, 1, -1);
- if (WARN("PREFER_SECTION",
- "__section($new) is preferred over __attribute__((section($old)))\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~ s/\b__attribute__\s*\(\s*\(\s*_*section_*\s*\(\s*\Q$old\E\s*\)\s*\)\s*\)/__section($new)/;
- }
- }
- if ($realfile !~ m@\binclude/uapi/@ &&
- $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf/) {
- if (WARN("PREFER_PRINTF",
- "__printf(string-index, first-to-check) is preferred over __attribute__((format(printf, string-index, first-to-check)))\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*printf\s*,\s*(.*)\)\s*\)\s*\)/"__printf(" . trim($1) . ")"/ex;
- }
- }
- if ($realfile !~ m@\binclude/uapi/@ &&
- $line =~ /\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\b/) {
- if (WARN("PREFER_SCANF",
- "__scanf(string-index, first-to-check) is preferred over __attribute__((format(scanf, string-index, first-to-check)))\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~ s/\b__attribute__\s*\(\s*\(\s*format\s*\(\s*scanf\s*,\s*(.*)\)\s*\)\s*\)/"__scanf(" . trim($1) . ")"/ex;
- }
- }
- if ($perl_version_ok &&
- $line =~ /(?:$Declare|$DeclareMisordered)\s*$Ident\s*$balanced_parens\s*(?:$Attribute)?\s*;/ &&
- ($line =~ /\b__attribute__\s*\(\s*\(.*\bweak\b/ ||
- $line =~ /\b__weak\b/)) {
- ERROR("WEAK_DECLARATION",
- "Using weak declarations can have unintended link defects\n" . $herecurr);
- }
- if ($realfile !~ m@\binclude/uapi/@ &&
- $line =~ /\b($Declare)\s*$Ident\s*[=;,\[]/) {
- my $type = $1;
- if ($type =~ /\b($typeC99Typedefs)\b/) {
- $type = $1;
- my $kernel_type = 'u';
- $kernel_type = 's' if ($type =~ /^_*[si]/);
- $type =~ /(\d+)/;
- $kernel_type .= $1;
- if (CHK("PREFER_KERNEL_TYPES",
- "Prefer kernel type '$kernel_type' over '$type'\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~ s/\b$type\b/$kernel_type/;
- }
- }
- }
- if ($line =~ /(\(\s*$C90_int_types\s*\)\s*)($Constant)\b/) {
- my $cast = $1;
- my $const = $2;
- if (WARN("TYPECAST_INT_CONSTANT",
- "Unnecessary typecast of c90 int constant\n" . $herecurr) &&
- $fix) {
- my $suffix = "";
- my $newconst = $const;
- $newconst =~ s/${Int_type}$//;
- $suffix .= 'U' if ($cast =~ /\bunsigned\b/);
- if ($cast =~ /\blong\s+long\b/) {
- $suffix .= 'LL';
- } elsif ($cast =~ /\blong\b/) {
- $suffix .= 'L';
- }
- $fixed[$fixlinenr] =~ s/\Q$cast\E$const\b/$newconst$suffix/;
- }
- }
- if ($line =~ /\bsizeof\s*\(\s*\&/) {
- WARN("SIZEOF_ADDRESS",
- "sizeof(& should be avoided\n" . $herecurr);
- }
- if ($line =~ /\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/) {
- if (WARN("SIZEOF_PARENTHESIS",
- "sizeof $1 should be sizeof($1)\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~ s/\bsizeof\s+((?:\*\s*|)$Lval|$Type(?:\s+$Lval|))/"sizeof(" . trim($1) . ")"/ex;
- }
- }
- if ($line =~ /^.\s*\bstruct\s+spinlock\s+\w+\s*;/) {
- WARN("USE_SPINLOCK_T",
- "struct spinlock should be spinlock_t\n" . $herecurr);
- }
- if ($sline =~ /\bseq_printf\s*\(.*"\s*\)\s*;\s*$/) {
- my $fmt = get_quoted_string($line, $rawline);
- $fmt =~ s/%%//g;
- if ($fmt !~ /%/) {
- if (WARN("PREFER_SEQ_PUTS",
- "Prefer seq_puts to seq_printf\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~ s/\bseq_printf\b/seq_puts/;
- }
- }
- }
- if ($perl_version_ok &&
- defined $stat &&
- $stat =~ /^\+(?![^\{]*\{\s*).*\b(\w+)\s*\(.*$String\s*,/s &&
- $1 !~ /^_*volatile_*$/) {
- my $stat_real;
- my $lc = $stat =~ tr@\n@@;
- $lc = $lc + $linenr;
- for (my $count = $linenr; $count <= $lc; $count++) {
- my $specifier;
- my $extension;
- my $qualifier;
- my $bad_specifier = "";
- my $fmt = get_quoted_string($lines[$count - 1], raw_line($count, 0));
- $fmt =~ s/%%//g;
- while ($fmt =~ /(\%[\*\d\.]*p(\w)(\w*))/g) {
- $specifier = $1;
- $extension = $2;
- $qualifier = $3;
- if ($extension !~ /[SsBKRraEehMmIiUDdgVCbGNOxtf]/ ||
- ($extension eq "f" &&
- defined $qualifier && $qualifier !~ /^w/)) {
- $bad_specifier = $specifier;
- last;
- }
- if ($extension eq "x" && !defined($stat_real)) {
- if (!defined($stat_real)) {
- $stat_real = get_stat_real($linenr, $lc);
- }
- WARN("VSPRINTF_SPECIFIER_PX",
- "Using vsprintf specifier '\%px' potentially exposes the kernel memory layout, if you don't really need the address please consider using '\%p'.\n" . "$here\n$stat_real\n");
- }
- }
- if ($bad_specifier ne "") {
- my $stat_real = get_stat_real($linenr, $lc);
- my $ext_type = "Invalid";
- my $use = "";
- if ($bad_specifier =~ /p[Ff]/) {
- $use = " - use %pS instead";
- $use =~ s/pS/ps/ if ($bad_specifier =~ /pf/);
- }
- WARN("VSPRINTF_POINTER_EXTENSION",
- "$ext_type vsprintf pointer extension '$bad_specifier'$use\n" . "$here\n$stat_real\n");
- }
- }
- }
- if ($perl_version_ok &&
- defined $stat &&
- $stat =~ /^\+(?:.*?)\bmemset\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\,\s*$FuncArg\s*\)/) {
- my $ms_addr = $2;
- my $ms_val = $7;
- my $ms_size = $12;
- if ($ms_size =~ /^(0x|)0$/i) {
- ERROR("MEMSET",
- "memset to 0's uses 0 as the 2nd argument, not the 3rd\n" . "$here\n$stat\n");
- } elsif ($ms_size =~ /^(0x|)1$/i) {
- WARN("MEMSET",
- "single byte memset is suspicious. Swapped 2nd/3rd argument?\n" . "$here\n$stat\n");
- }
- }
- if ($perl_version_ok &&
- defined $stat &&
- $stat =~ /^\+(?:.*?)\b(min|max)\s*\(\s*$FuncArg\s*,\s*$FuncArg\s*\)/) {
- if (defined $2 || defined $7) {
- my $call = $1;
- my $cast1 = deparenthesize($2);
- my $arg1 = $3;
- my $cast2 = deparenthesize($7);
- my $arg2 = $8;
- my $cast;
- if ($cast1 ne "" && $cast2 ne "" && $cast1 ne $cast2) {
- $cast = "$cast1 or $cast2";
- } elsif ($cast1 ne "") {
- $cast = $cast1;
- } else {
- $cast = $cast2;
- }
- WARN("MINMAX",
- "$call() should probably be ${call}_t($cast, $arg1, $arg2)\n" . "$here\n$stat\n");
- }
- }
- if ($perl_version_ok &&
- defined $stat &&
- $stat =~ /^\+(?:.*?)\busleep_range\s*\(\s*($FuncArg)\s*,\s*($FuncArg)\s*\)/) {
- my $min = $1;
- my $max = $7;
- if ($min eq $max) {
- WARN("USLEEP_RANGE",
- "usleep_range should not use min == max args; see Documentation/timers/timers-howto.rst\n" . "$here\n$stat\n");
- } elsif ($min =~ /^\d+$/ && $max =~ /^\d+$/ &&
- $min > $max) {
- WARN("USLEEP_RANGE",
- "usleep_range args reversed, use min then max; see Documentation/timers/timers-howto.rst\n" . "$here\n$stat\n");
- }
- }
- if ($perl_version_ok &&
- defined $stat &&
- $line =~ /\bsscanf\b/ &&
- ($stat !~ /$Ident\s*=\s*sscanf\s*$balanced_parens/ &&
- $stat !~ /\bsscanf\s*$balanced_parens\s*(?:$Compare)/ &&
- $stat !~ /(?:$Compare)\s*\bsscanf\s*$balanced_parens/)) {
- my $lc = $stat =~ tr@\n@@;
- $lc = $lc + $linenr;
- my $stat_real = get_stat_real($linenr, $lc);
- WARN("NAKED_SSCANF",
- "unchecked sscanf return value\n" . "$here\n$stat_real\n");
- }
- if ($perl_version_ok &&
- defined $stat &&
- $line =~ /\bsscanf\b/) {
- my $lc = $stat =~ tr@\n@@;
- $lc = $lc + $linenr;
- my $stat_real = get_stat_real($linenr, $lc);
- if ($stat_real =~ /\bsscanf\b\s*\(\s*$FuncArg\s*,\s*("[^"]+")/) {
- my $format = $6;
- my $count = $format =~ tr@%@%@;
- if ($count == 1 &&
- $format =~ /^"\%(?i:ll[udxi]|[udxi]ll|ll|[hl]h?[udxi]|[udxi][hl]h?|[hl]h?|[udxi])"$/) {
- WARN("SSCANF_TO_KSTRTO",
- "Prefer kstrto<type> to single variable sscanf\n" . "$here\n$stat_real\n");
- }
- }
- }
- if ($realfile =~ /\.h$/ &&
- $line =~ /^\+\s*(extern\s+)$Type\s*$Ident\s*\(/s) {
- if (CHK("AVOID_EXTERNS",
- "extern prototypes should be avoided in .h files\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~ s/(.*)\bextern\b\s*(.*)/$1$2/;
- }
- }
- if ($realfile =~ /\.c$/ && defined $stat &&
- $stat =~ /^.\s*(?:extern\s+)?$Type\s+($Ident)(\s*)\(/s)
- {
- my $function_name = $1;
- my $paren_space = $2;
- my $s = $stat;
- if (defined $cond) {
- substr($s, 0, length($cond), '');
- }
- if ($s =~ /^\s*;/)
- {
- WARN("AVOID_EXTERNS",
- "externs should be avoided in .c files\n" . $herecurr);
- }
- if ($paren_space =~ /\n/) {
- WARN("FUNCTION_ARGUMENTS",
- "arguments for function declarations should follow identifier\n" . $herecurr);
- }
- } elsif ($realfile =~ /\.c$/ && defined $stat &&
- $stat =~ /^.\s*extern\s+/)
- {
- WARN("AVOID_EXTERNS",
- "externs should be avoided in .c files\n" . $herecurr);
- }
- if (defined $stat &&
- $stat =~ /^.\s*(?:extern\s+)?$Type\s*(?:$Ident|\(\s*\*\s*$Ident\s*\))\s*\(\s*([^{]+)\s*\)\s*;/s &&
- $1 ne "void") {
- my $args = trim($1);
- while ($args =~ m/\s*($Type\s*(?:$Ident|\(\s*\*\s*$Ident?\s*\)\s*$balanced_parens)?)/g) {
- my $arg = trim($1);
- if ($arg =~ /^$Type$/ && $arg !~ /enum\s+$Ident$/) {
- WARN("FUNCTION_ARGUMENTS",
- "function definition argument '$arg' should also have an identifier name\n" . $herecurr);
- }
- }
- }
- if ($perl_version_ok &&
- defined $stat &&
- $stat =~ /^.\s*(?:$Storage\s+)?$Type\s*($Ident)\s*$balanced_parens\s*{/s) {
- $context_function = $1;
- my $ok = 0;
- my $cnt = statement_rawlines($stat);
- my $herectx = $here . "\n";
- for (my $n = 0; $n < $cnt; $n++) {
- my $rl = raw_line($linenr, $n);
- $herectx .= $rl . "\n";
- $ok = 1 if ($rl =~ /^[ \+]\{/);
- $ok = 1 if ($rl =~ /\{/ && $n == 0);
- last if $rl =~ /^[ \+].*\{/;
- }
- if (!$ok) {
- ERROR("OPEN_BRACE",
- "open brace '{' following function definitions go on the next line\n" . $herectx);
- }
- }
- if ($rawline =~ /\b__setup\("([^"]*)"/) {
- my $name = $1;
- if (!grep(/$name/, @setup_docs)) {
- CHK("UNDOCUMENTED_SETUP",
- "__setup appears un-documented -- check Documentation/admin-guide/kernel-parameters.txt\n" . $herecurr);
- }
- }
- if ($line =~ /\*\s*\)\s*$allocFunctions\b/) {
- WARN("UNNECESSARY_CASTS",
- "unnecessary cast may hide bugs, see http://c-faq.com/malloc/mallocnocast.html\n" . $herecurr);
- }
- if ($perl_version_ok &&
- $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*((?:kv|k|v)[mz]alloc(?:_node)?)\s*\(\s*(sizeof\s*\(\s*struct\s+$Lval\s*\))/) {
- CHK("ALLOC_SIZEOF_STRUCT",
- "Prefer $3(sizeof(*$1)...) over $3($4...)\n" . $herecurr);
- }
- if ($perl_version_ok &&
- defined $stat &&
- $stat =~ /^\+\s*($Lval)\s*\=\s*(?:$balanced_parens)?\s*(k[mz]alloc)\s*\(\s*($FuncArg)\s*\*\s*($FuncArg)\s*,/) {
- my $oldfunc = $3;
- my $a1 = $4;
- my $a2 = $10;
- my $newfunc = "kmalloc_array";
- $newfunc = "kcalloc" if ($oldfunc eq "kzalloc");
- my $r1 = $a1;
- my $r2 = $a2;
- if ($a1 =~ /^sizeof\s*\S/) {
- $r1 = $a2;
- $r2 = $a1;
- }
- if ($r1 !~ /^sizeof\b/ && $r2 =~ /^sizeof\s*\S/ &&
- !($r1 =~ /^$Constant$/ || $r1 =~ /^[A-Z_][A-Z0-9_]*$/)) {
- my $cnt = statement_rawlines($stat);
- my $herectx = get_stat_here($linenr, $cnt, $here);
- if (WARN("ALLOC_WITH_MULTIPLY",
- "Prefer $newfunc over $oldfunc with multiply\n" . $herectx) &&
- $cnt == 1 &&
- $fix) {
- $fixed[$fixlinenr] =~ s/\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*(k[mz]alloc)\s*\(\s*($FuncArg)\s*\*\s*($FuncArg)/$1 . ' = ' . "$newfunc(" . trim($r1) . ', ' . trim($r2)/e;
- }
- }
- }
- if ($perl_version_ok &&
- $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*krealloc\s*\(\s*($Lval)\s*,/ &&
- $1 eq $3) {
- WARN("KREALLOC_ARG_REUSE",
- "Reusing the krealloc arg is almost always a bug\n" . $herecurr);
- }
- if ($line =~ /\b(kcalloc|kmalloc_array)\s*\(\s*sizeof\b/) {
- WARN("ALLOC_ARRAY_ARGS",
- "$1 uses number as first arg, sizeof is generally wrong\n" . $herecurr);
- }
- if ($line =~ /;\s*;\s*$/) {
- if (WARN("ONE_SEMICOLON",
- "Statements terminations use 1 semicolon\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~ s/(\s*;\s*){2,}$/;/g;
- }
- }
- if ($realfile !~ m@^include/uapi/@ &&
- $line =~ /#\s*define\s+\w+\s+\(?\s*1\s*([ulUL]*)\s*\<\<\s*(?:\d+|$Ident)\s*\)?/) {
- my $ull = "";
- $ull = "_ULL" if (defined($1) && $1 =~ /ll/i);
- if (CHK("BIT_MACRO",
- "Prefer using the BIT$ull macro\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~ s/\(?\s*1\s*[ulUL]*\s*<<\s*(\d+|$Ident)\s*\)?/BIT${ull}($1)/;
- }
- }
- if ($rawline =~ /\bIS_ENABLED\s*\(\s*(\w+)\s*\)/ && $1 !~ /^CONFIG_/) {
- WARN("IS_ENABLED_CONFIG",
- "IS_ENABLED($1) is normally used as IS_ENABLED(CONFIG_$1)\n" . $herecurr);
- }
- if ($line =~ /^\+\s*#\s*if\s+defined(?:\s*\(?\s*|\s+)(CONFIG_[A-Z_]+)\s*\)?\s*\|\|\s*defined(?:\s*\(?\s*|\s+)\1_MODULE\s*\)?\s*$/) {
- my $config = $1;
- if (WARN("PREFER_IS_ENABLED",
- "Prefer IS_ENABLED(<FOO>) to CONFIG_<FOO> || CONFIG_<FOO>_MODULE\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] = "\+#if IS_ENABLED($config)";
- }
- }
- if ($perl_version_ok &&
- defined $stat &&
- $stat =~ /^\+[$;\s]*(?:case[$;\s]+\w+[$;\s]*:[$;\s]*|)*[$;\s]*\bdefault[$;\s]*:[$;\s]*;/g) {
- my $cnt = statement_rawlines($stat);
- my $herectx = get_stat_here($linenr, $cnt, $here);
- WARN("DEFAULT_NO_BREAK",
- "switch default: should use break\n" . $herectx);
- }
- if ($line =~ /\b__FUNCTION__\b/) {
- if (WARN("USE_FUNC",
- "__func__ should be used instead of gcc specific __FUNCTION__\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~ s/\b__FUNCTION__\b/__func__/g;
- }
- }
- while ($line =~ /\b(__(?:DATE|TIME|TIMESTAMP)__)\b/g) {
- ERROR("DATE_TIME",
- "Use of the '$1' macro makes the build non-deterministic\n" . $herecurr);
- }
- if ($line =~ /\byield\s*\(\s*\)/) {
- WARN("YIELD",
- "Using yield() is generally wrong. See yield() kernel-doc (sched/core.c)\n" . $herecurr);
- }
- if ($line =~ /\+\s*(.*?)\b(true|false|$Lval)\s*(==|\!=)\s*(true|false|$Lval)\b(.*)$/i) {
- my $lead = $1;
- my $arg = $2;
- my $test = $3;
- my $otype = $4;
- my $trail = $5;
- my $op = "!";
- ($arg, $otype) = ($otype, $arg) if ($arg =~ /^(?:true|false)$/i);
- my $type = lc($otype);
- if ($type =~ /^(?:true|false)$/) {
- if (("$test" eq "==" && "$type" eq "true") ||
- ("$test" eq "!=" && "$type" eq "false")) {
- $op = "";
- }
- CHK("BOOL_COMPARISON",
- "Using comparison to $otype is error prone\n" . $herecurr);
- }
- }
- if ($line =~ /^.\s*sema_init.+,\W?0\W?\)/) {
- WARN("CONSIDER_COMPLETION",
- "consider using a completion\n" . $herecurr);
- }
- if ($line =~ /\b((simple|strict)_(strto(l|ll|ul|ull)))\s*\(/) {
- WARN("CONSIDER_KSTRTO",
- "$1 is obsolete, use k$3 instead\n" . $herecurr);
- }
- if ($line =~ /^.\s*__initcall\s*\(/) {
- WARN("USE_DEVICE_INITCALL",
- "please use device_initcall() or more appropriate function instead of __initcall() (see include/linux/init.h)\n" . $herecurr);
- }
- if ($line =~ /\bspin_is_locked\(/) {
- WARN("USE_LOCKDEP",
- "Where possible, use lockdep_assert_held instead of assertions based on spin_is_locked\n" . $herecurr);
- }
- if ($line =~ /\b($deprecated_apis_search)\b\s*\(/) {
- my $deprecated_api = $1;
- my $new_api = $deprecated_apis{$deprecated_api};
- WARN("DEPRECATED_API",
- "Deprecated use of '$deprecated_api', prefer '$new_api' instead\n" . $herecurr);
- }
- if (defined($const_structs) &&
- $line !~ /\bconst\b/ &&
- $line =~ /\bstruct\s+($const_structs)\b(?!\s*\{)/) {
- WARN("CONST_STRUCT",
- "struct $1 should normally be const\n" . $herecurr);
- }
- if ($line =~ /\bNR_CPUS\b/ &&
- $line !~ /^.\s*\s*#\s*if\b.*\bNR_CPUS\b/ &&
- $line !~ /^.\s*\s*#\s*define\b.*\bNR_CPUS\b/ &&
- $line !~ /^.\s*$Declare\s.*\[[^\]]*NR_CPUS[^\]]*\]/ &&
- $line !~ /\[[^\]]*\.\.\.[^\]]*NR_CPUS[^\]]*\]/ &&
- $line !~ /\[[^\]]*NR_CPUS[^\]]*\.\.\.[^\]]*\]/)
- {
- WARN("NR_CPUS",
- "usage of NR_CPUS is often wrong - consider using cpu_possible(), num_possible_cpus(), for_each_possible_cpu(), etc\n" . $herecurr);
- }
- if ($line =~ /\+\s*#\s*define\s+((?:__)?ARCH_(?:HAS|HAVE)\w*)\b/) {
- ERROR("DEFINE_ARCH_HAS",
- "#define of '$1' is wrong - use Kconfig variables or standard guards instead\n" . $herecurr);
- }
- if ($perl_version_ok &&
- $line =~ /\b((?:un)?likely)\s*\(\s*$FuncArg\s*\)\s*$Compare/) {
- WARN("LIKELY_MISUSE",
- "Using $1 should generally have parentheses around the comparison\n" . $herecurr);
- }
- if ($line =~ /\b(?:(?:un)?likely)\s*\(\s*!?\s*(IS_ERR(?:_OR_NULL|_VALUE)?|WARN)/) {
- WARN("LIKELY_MISUSE",
- "nested (un)?likely() calls, $1 already uses unlikely() internally\n" . $herecurr);
- }
- if ($line =~ /\bin_atomic\s*\(/) {
- if ($realfile =~ m@^drivers/@) {
- ERROR("IN_ATOMIC",
- "do not use in_atomic in drivers\n" . $herecurr);
- } elsif ($realfile !~ m@^kernel/@) {
- WARN("IN_ATOMIC",
- "use of in_atomic() is incorrect outside core kernel code\n" . $herecurr);
- }
- }
- if ($line =~ /mutex_trylock_recursive/) {
- ERROR("LOCKING",
- "recursive locking is bad, do not use this ever.\n" . $herecurr);
- }
- if ($line =~ /^.\s*lockdep_set_novalidate_class\s*\(/ ||
- $line =~ /__lockdep_no_validate__\s*\)/ ) {
- if ($realfile !~ m@^kernel/lockdep@ &&
- $realfile !~ m@^include/linux/lockdep@ &&
- $realfile !~ m@^drivers/base/core@) {
- ERROR("LOCKDEP",
- "lockdep_no_validate class is reserved for device->mutex.\n" . $herecurr);
- }
- }
- if ($line =~ /debugfs_create_\w+.*\b$mode_perms_world_writable\b/ ||
- $line =~ /DEVICE_ATTR.*\b$mode_perms_world_writable\b/) {
- WARN("EXPORTED_WORLD_WRITABLE",
- "Exporting world writable files is usually an error. Consider more restrictive permissions.\n" . $herecurr);
- }
- if ($perl_version_ok &&
- defined $stat &&
- $stat =~ /\bDEVICE_ATTR\s*\(\s*(\w+)\s*,\s*\(?\s*(\s*(?:${multi_mode_perms_string_search}|0[0-7]{3,3})\s*)\s*\)?\s*,\s*(\w+)\s*,\s*(\w+)\s*\)/) {
- my $var = $1;
- my $perms = $2;
- my $show = $3;
- my $store = $4;
- my $octal_perms = perms_to_octal($perms);
- if ($show =~ /^${var}_show$/ &&
- $store =~ /^${var}_store$/ &&
- $octal_perms eq "0644") {
- if (WARN("DEVICE_ATTR_RW",
- "Use DEVICE_ATTR_RW\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~ s/\bDEVICE_ATTR\s*\(\s*$var\s*,\s*\Q$perms\E\s*,\s*$show\s*,\s*$store\s*\)/DEVICE_ATTR_RW(${var})/;
- }
- } elsif ($show =~ /^${var}_show$/ &&
- $store =~ /^NULL$/ &&
- $octal_perms eq "0444") {
- if (WARN("DEVICE_ATTR_RO",
- "Use DEVICE_ATTR_RO\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~ s/\bDEVICE_ATTR\s*\(\s*$var\s*,\s*\Q$perms\E\s*,\s*$show\s*,\s*NULL\s*\)/DEVICE_ATTR_RO(${var})/;
- }
- } elsif ($show =~ /^NULL$/ &&
- $store =~ /^${var}_store$/ &&
- $octal_perms eq "0200") {
- if (WARN("DEVICE_ATTR_WO",
- "Use DEVICE_ATTR_WO\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~ s/\bDEVICE_ATTR\s*\(\s*$var\s*,\s*\Q$perms\E\s*,\s*NULL\s*,\s*$store\s*\)/DEVICE_ATTR_WO(${var})/;
- }
- } elsif ($octal_perms eq "0644" ||
- $octal_perms eq "0444" ||
- $octal_perms eq "0200") {
- my $newshow = "$show";
- $newshow = "${var}_show" if ($show ne "NULL" && $show ne "${var}_show");
- my $newstore = $store;
- $newstore = "${var}_store" if ($store ne "NULL" && $store ne "${var}_store");
- my $rename = "";
- if ($show ne $newshow) {
- $rename .= " '$show' to '$newshow'";
- }
- if ($store ne $newstore) {
- $rename .= " '$store' to '$newstore'";
- }
- WARN("DEVICE_ATTR_FUNCTIONS",
- "Consider renaming function(s)$rename\n" . $herecurr);
- } else {
- WARN("DEVICE_ATTR_PERMS",
- "DEVICE_ATTR unusual permissions '$perms' used\n" . $herecurr);
- }
- }
- if ($perl_version_ok &&
- defined $stat &&
- $line =~ /$mode_perms_search/) {
- foreach my $entry (@mode_permission_funcs) {
- my $func = $entry->[0];
- my $arg_pos = $entry->[1];
- my $lc = $stat =~ tr@\n@@;
- $lc = $lc + $linenr;
- my $stat_real = get_stat_real($linenr, $lc);
- my $skip_args = "";
- if ($arg_pos > 1) {
- $arg_pos--;
- $skip_args = "(?:\\s*$FuncArg\\s*,\\s*){$arg_pos,$arg_pos}";
- }
- my $test = "\\b$func\\s*\\(${skip_args}($FuncArg(?:\\|\\s*$FuncArg)*)\\s*[,\\)]";
- if ($stat =~ /$test/) {
- my $val = $1;
- $val = $6 if ($skip_args ne "");
- if (!($func =~ /^(?:module_param|proc_create)/ && $val eq "0") &&
- (($val =~ /^$Int$/ && $val !~ /^$Octal$/) ||
- ($val =~ /^$Octal$/ && length($val) ne 4))) {
- ERROR("NON_OCTAL_PERMISSIONS",
- "Use 4 digit octal (0777) not decimal permissions\n" . "$here\n" . $stat_real);
- }
- if ($val =~ /^$Octal$/ && (oct($val) & 02)) {
- ERROR("EXPORTED_WORLD_WRITABLE",
- "Exporting writable files is usually an error. Consider more restrictive permissions.\n" . "$here\n" . $stat_real);
- }
- }
- }
- }
- while ($line =~ m{\b($multi_mode_perms_string_search)\b}g) {
- my $oval = $1;
- my $octal = perms_to_octal($oval);
- if (WARN("SYMBOLIC_PERMS",
- "Symbolic permissions '$oval' are not preferred. Consider using octal permissions '$octal'.\n" . $herecurr) &&
- $fix) {
- $fixed[$fixlinenr] =~ s/\Q$oval\E/$octal/;
- }
- }
- if ($line =~ /\bMODULE_LICENSE\s*\(\s*($String)\s*\)/) {
- my $extracted_string = get_quoted_string($line, $rawline);
- my $valid_licenses = qr{
- GPL|
- GPL\ v2|
- GPL\ and\ additional\ rights|
- Dual\ BSD/GPL|
- Dual\ MIT/GPL|
- Dual\ MPL/GPL|
- Proprietary
- }x;
- if ($extracted_string !~ /^"(?:$valid_licenses)"$/x) {
- WARN("MODULE_LICENSE",
- "unknown module license " . $extracted_string . "\n" . $herecurr);
- }
- }
- if ($line =~ /\.extra[12]\s*=\s*&(zero|one|int_max)\b/) {
- WARN("DUPLICATED_SYSCTL_CONST",
- "duplicated sysctl range checking value '$1', consider using the shared one in include/linux/sysctl.h\n" . $herecurr);
- }
- }
-
-
- if ($#rawlines == -1) {
- exit(0);
- }
-
-
- if ($mailback && ($clean == 1 || !$is_patch)) {
- exit(0);
- }
-
-
- if (!$chk_patch && !$is_patch) {
- exit(0);
- }
- if (!$is_patch && $filename !~ /cover-letter\.patch$/) {
- ERROR("NOT_UNIFIED_DIFF",
- "Does not appear to be a unified-diff format patch\n");
- }
- if ($is_patch && $has_commit_log && $chk_signoff) {
- if ($signoff == 0) {
- ERROR("MISSING_SIGN_OFF",
- "Missing Signed-off-by: line(s)\n");
- } elsif (!$authorsignoff) {
- WARN("NO_AUTHOR_SIGN_OFF",
- "Missing Signed-off-by: line by nominal patch author '$author'\n");
- }
- }
- print report_dump();
- if ($summary && !($clean == 1 && $quiet == 1)) {
- print "$filename " if ($summary_file);
- print "total: $cnt_error errors, $cnt_warn warnings, " .
- (($check)? "$cnt_chk checks, " : "") .
- "$cnt_lines lines checked\n";
- }
- if ($quiet == 0) {
-
- if (!$clean and !$fix) {
- print << "EOM"
- NOTE: For some of the reported defects, checkpatch may be able to
- mechanically convert to the typical style using --fix or --fix-inplace.
- EOM
- }
-
-
- if ($rpt_cleaners) {
- $rpt_cleaners = 0;
- print << "EOM"
- NOTE: Whitespace errors detected.
- You may wish to use scripts/cleanpatch or scripts/cleanfile
- EOM
- }
- }
- if ($clean == 0 && $fix &&
- ("@rawlines" ne "@fixed" ||
- $#fixed_inserted >= 0 || $#fixed_deleted >= 0)) {
- my $newfile = $filename;
- $newfile .= ".EXPERIMENTAL-checkpatch-fixes" if (!$fix_inplace);
- my $linecount = 0;
- my $f;
- @fixed = fix_inserted_deleted_lines(\@fixed, \@fixed_inserted, \@fixed_deleted);
- open($f, '>', $newfile)
- or die "$P: Can't open $newfile for write\n";
- foreach my $fixed_line (@fixed) {
- $linecount++;
- if ($file) {
- if ($linecount > 3) {
- $fixed_line =~ s/^\+//;
- print $f $fixed_line . "\n";
- }
- } else {
- print $f $fixed_line . "\n";
- }
- }
- close($f);
- if (!$quiet) {
- print << "EOM";
- Wrote EXPERIMENTAL --fix correction(s) to '$newfile'
- Do _NOT_ trust the results written to this file.
- Do _NOT_ submit these changes without inspecting them for correctness.
- This EXPERIMENTAL file is simply a convenience to help rewrite patches.
- No warranties, expressed or implied...
- EOM
- }
- }
- if ($quiet == 0) {
- print "\n";
- if ($clean == 1) {
- print "$vname has no obvious style problems and is ready for submission.\n";
- } else {
- print "$vname has style problems, please review.\n";
- }
- }
- return $clean;
- }
|