[{"data":1,"prerenderedAt":1758},["ShallowReactive",2],{"/blog/how-to-fuzz-go":3,"navigation-en-us":976,"banner-en-us":1404,"footer-en-us":1414,"blog-post-authors-en-us-Yevgeny Pats":1658,"blog-related-posts-en-us-how-to-fuzz-go":1672,"blog-promotions-en-us":1695,"next-steps-en-us":1748},{"id":4,"title":5,"authors":6,"body":8,"category":955,"date":956,"description":957,"extension":958,"externalUrl":959,"faq":959,"featured":960,"heroImage":961,"meta":962,"navigation":117,"path":963,"seo":964,"slug":968,"stem":969,"tags":970,"template":974,"updatedDate":959,"__hash__":975},"blogPosts/en-us/blog/how-to-fuzz-go.md","How to fuzz Go code with go-fuzz continuously",[7],"Yevgeny Pats",{"type":9,"value":10,"toc":948},"minimark",[11,16,20,24,33,41,45,59,62,73,77,92,326,334,340,343,867,870,874,887,893,900,921,929,944],[12,13,15],"h2",{"id":14},"what-is-fuzzing","What is fuzzing?",[17,18,19],"p",{},"Fuzzing or fuzz testing is an automated software technique that involves providing semi-random data as\ninput to the test program in order to uncover bugs and crashes.",[12,21,23],{"id":22},"why-fuzz-go-code","Why fuzz Go Code?",[17,25,26,32],{},[27,28,31],"a",{"href":29,"rel":30},"https://golang.org/",[],"Golang"," is a safe language and memory corruption issues are a thing of the past so we don’t need to fuzz our code,\nright? Wrong 😃. Any code, and especially code where stability, quality, and coverage are important, is worth fuzzing.\nFuzzing can uncover logical bugs and denial-of-service  in critical components can lead to security issues as well.",[17,34,35,36],{},"As a reference to almost infinite amount of bugs found with go-fuzz (only the documented one) you can look ",[27,37,40],{"href":38,"rel":39},"https://github.com/dvyukov/go-fuzz#trophies",[],"here",[12,42,44],{"id":43},"enter-go-fuzz","Enter go-fuzz",[17,46,47,52,53,58],{},[27,48,51],{"href":49,"rel":50},"https://github.com/dvyukov/go-fuzz",[],"go-fuzz"," is the current de-facto standard fuzzer for go and was initially developed by ",[27,54,57],{"href":55,"rel":56},"https://twitter.com/dvyukov",[],"Dmitry Vyukov",".\nIt is a coverage guided fuzzer which means it uses coverage instrumentation and feedback to generate test-cases which proved to be very successful both by go-fuzz and originally by fuzzers like AFL.",[17,60,61],{},"go-fuzz algorithm and in general coverage guided fuzzers works as follows:",[63,64,70],"pre",{"className":65,"code":67,"language":68,"meta":69},[66],"language-text","// pseudo code\nInstrument program for code coverage\nfor {\n  Choose random input from corpus\n  Mutate input\n  Execute input and collect coverage\n  If new coverage/paths are hit add it to corpus (corpus - directory with test-cases)\n}\n","text","",[71,72,67],"code",{"__ignoreMap":69},[12,74,76],{"id":75},"building-running","Building & Running",[17,78,79,80,85,86,91],{},"If you are already familiar with this part you can skip to \"Running go-fuzz from GitLab-CI\" section.\nwe will use ",[27,81,84],{"href":82,"rel":83},"https://gitlab.com/gitlab-org/security-products/demos/coverage-fuzzing/go-fuzzing-example",[],"go-fuzzing-example"," as a simple example.\nFor the sake of the example we have a simple ",[27,87,90],{"href":88,"rel":89},"https://gitlab.com/gitlab-org/security-products/demos/coverage-fuzzing/go-fuzzing-example/-/blob/master/parse_complex.go",[],"function"," with an off-by-one bug:",[63,93,97],{"className":94,"code":95,"language":96,"meta":69,"style":69},"language-go shiki shiki-themes github-light","package parser\n\nfunc ParseComplex(data [] byte) bool {\n    if len(data) == 5 {\n        if data[0] == 'F' && data[1] == 'U' && data[2] == 'Z' && data[3] == 'Z' && data[4] == 'I' && data[5] == 'T' {\n            return true\n        }\n    }\n    return false\n}\n","go",[71,98,99,112,119,150,171,290,299,305,311,320],{"__ignoreMap":69},[100,101,104,108],"span",{"class":102,"line":103},"line",1,[100,105,107],{"class":106},"sD7c4","package",[100,109,111],{"class":110},"s7eDp"," parser\n",[100,113,115],{"class":102,"line":114},2,[100,116,118],{"emptyLinePlaceholder":117},true,"\n",[100,120,122,125,128,132,135,138,141,144,147],{"class":102,"line":121},3,[100,123,124],{"class":106},"func",[100,126,127],{"class":110}," ParseComplex",[100,129,131],{"class":130},"sgsFI","(",[100,133,134],{"class":110},"data",[100,136,137],{"class":130}," [] ",[100,139,140],{"class":106},"byte",[100,142,143],{"class":130},") ",[100,145,146],{"class":106},"bool",[100,148,149],{"class":130}," {\n",[100,151,153,156,159,162,165,169],{"class":102,"line":152},4,[100,154,155],{"class":106},"    if",[100,157,158],{"class":110}," len",[100,160,161],{"class":130},"(data) ",[100,163,164],{"class":106},"==",[100,166,168],{"class":167},"sYu0t"," 5",[100,170,149],{"class":130},[100,172,174,177,180,183,186,188,192,195,198,201,203,206,208,210,212,215,217,219,221,224,226,228,230,233,235,237,239,242,244,246,248,250,252,254,256,259,261,263,265,268,270,272,274,277,279,281,283,286,288],{"class":102,"line":173},5,[100,175,176],{"class":106},"        if",[100,178,179],{"class":130}," data[",[100,181,182],{"class":167},"0",[100,184,185],{"class":130},"] ",[100,187,164],{"class":106},[100,189,191],{"class":190},"sYBdl"," '",[100,193,194],{"class":167},"F",[100,196,197],{"class":190},"'",[100,199,200],{"class":106}," &&",[100,202,179],{"class":130},[100,204,205],{"class":167},"1",[100,207,185],{"class":130},[100,209,164],{"class":106},[100,211,191],{"class":190},[100,213,214],{"class":167},"U",[100,216,197],{"class":190},[100,218,200],{"class":106},[100,220,179],{"class":130},[100,222,223],{"class":167},"2",[100,225,185],{"class":130},[100,227,164],{"class":106},[100,229,191],{"class":190},[100,231,232],{"class":167},"Z",[100,234,197],{"class":190},[100,236,200],{"class":106},[100,238,179],{"class":130},[100,240,241],{"class":167},"3",[100,243,185],{"class":130},[100,245,164],{"class":106},[100,247,191],{"class":190},[100,249,232],{"class":167},[100,251,197],{"class":190},[100,253,200],{"class":106},[100,255,179],{"class":130},[100,257,258],{"class":167},"4",[100,260,185],{"class":130},[100,262,164],{"class":106},[100,264,191],{"class":190},[100,266,267],{"class":167},"I",[100,269,197],{"class":190},[100,271,200],{"class":106},[100,273,179],{"class":130},[100,275,276],{"class":167},"5",[100,278,185],{"class":130},[100,280,164],{"class":106},[100,282,191],{"class":190},[100,284,285],{"class":167},"T",[100,287,197],{"class":190},[100,289,149],{"class":130},[100,291,293,296],{"class":102,"line":292},6,[100,294,295],{"class":106},"            return",[100,297,298],{"class":167}," true\n",[100,300,302],{"class":102,"line":301},7,[100,303,304],{"class":130},"        }\n",[100,306,308],{"class":102,"line":307},8,[100,309,310],{"class":130},"    }\n",[100,312,314,317],{"class":102,"line":313},9,[100,315,316],{"class":106},"    return",[100,318,319],{"class":167}," false\n",[100,321,323],{"class":102,"line":322},10,[100,324,325],{"class":130},"}\n",[17,327,328,329,333],{},"Our fuzz ",[27,330,90],{"href":331,"rel":332},"https://gitlab.com/gitlab-org/security-products/demos/coverage-fuzzing/go-fuzzing-example/-/blob/master/parse_complex_fuzz.go",[]," will look like this and will be called by go-fuzz in a infinite loop with the generated data according to the coverage-guided algorithm",[63,335,338],{"className":336,"code":337,"language":68,"meta":69},[66],"// +build gofuzz\n\npackage parser\n\nfunc Fuzz(data []byte) int {\n    ParseComplex(data)\n    return 0\n}\n",[71,339,337],{"__ignoreMap":69},[17,341,342],{},"To run the fuzzer we need to build an instrumented version of the code together with the fuzz function.\nThis is done with the following simple steps:",[63,344,348],{"className":345,"code":346,"language":347,"meta":69,"style":69},"language-shell shiki shiki-themes github-light","docker run -it golang /bin/bash\n\n# Download this example\ngo get gitlab.com/gitlab-org/security-products/demos/coverage-fuzzing/go-fuzzing-example\ncd /go/src/gitlab.com/gitlab-org/security-products/demos/coverage-fuzzing/go-fuzzing-example\n\n# download go-fuzz and clang (libfuzzer)\ngo get -u github.com/dvyukov/go-fuzz/go-fuzz github.com/dvyukov/go-fuzz/go-fuzz-build\napt update && apt install -y clang\n\n# building instrumented version of the code together with libFuzzer integration\ngo-fuzz-build -libfuzzer -o parse-complex.a .\nclang -fsanitize=fuzzer parse-complex.a -o parse-complex\n\n./parse-complex\n\n#490479 NEW    ft: 11 corp: 7/37b lim: 477 exec/s: 11962 rss: 25Mb L: 6/6 MS: 1 ChangeByte-\n#524288 pulse  ft: 11 corp: 7/37b lim: 509 exec/s: 11915 rss: 25Mb\n#1048576        pulse  ft: 11 corp: 7/37b lim: 1030 exec/s: 11915 rss: 25Mb\npanic: runtime error: index out of range [6] with length 6\n\ngoroutine 17 [running, locked to thread]:\ngitlab.com/fuzzing-examples/example-go.ParseComplex.func6(...)\n        /go/src/gitlab.com/gitlab-org/security-products/demos/coverage-fuzzing/go-fuzzing-example/parse_complex.go:5\ngitlab.com/fuzzing-examples/example-go.ParseComplex(0x36f1cd0, 0x6, 0x6, 0x7ffeaa0d1f80)\n        /go/src/gitlab.com/gitlab-org/security-products/demos/coverage-fuzzing/go-fuzzing-example/parse_complex.go:5 +0x1b8\ngitlab.com/fuzzing-examples/example-go.Fuzz(...)\n        /go/src/gitlab.com/gitlab-org/security-products/demos/coverage-fuzzing/go-fuzzing-example/parse_complex_fuzz.go:6\nmain.LLVMFuzzerTestOneInput(0x36f1cd0, 0x6, 0x18)\n        gitlab.com/fuzzing-examples/example-go/go.fuzz.main/main.go:35 +0x85\nmain._cgoexpwrap_98ba7f745c88_LLVMFuzzerTestOneInput(0x36f1cd0, 0x6, 0x5a4d80)\n        _cgo_gotypes.go:64 +0x37\n==1664== ERROR: libFuzzer: deadly signal\n    #0 0x450ddf in __sanitizer_print_stack_trace (/go/src/gitlab.com/gitlab-org/security-products/demos/coverage-fuzzing/go-fuzzing-example/parse-complex+0x450ddf)\n    #1 0x430f4b in fuzzer::PrintStackTrace() (/go/src/gitlab.com/gitlab-org/security-products/demos/coverage-fuzzing/go-fuzzing-example/parse-complex+0x430f4b)\n    #2 0x414b7b in fuzzer::Fuzzer::CrashCallback() (/go/src/gitlab.com/gitlab-org/security-products/demos/coverage-fuzzing/go-fuzzing-example/parse-complex+0x414b7b)\n    #3 0x414b3f in fuzzer::Fuzzer::StaticCrashSignalCallback() (/go/src/gitlab.com/gitlab-org/security-products/demos/coverage-fuzzing/go-fuzzing-example/parse-complex+0x414b3f)\n    #4 0x7f57c561d72f  (/lib/x86_64-linux-gnu/libpthread.so.0+0x1272f)\n    #5 0x4b3a00 in runtime.raise runtime/sys_linux_amd64.s:164\n\nNOTE: libFuzzer has rudimentary signal handlers.\n      Combine libFuzzer with AddressSanitizer or similar for better crash reports.\nSUMMARY: libFuzzer: deadly signal\nMS: 1 ChangeByte-; base unit: eef4acc7500228bd0f65760be21896f230e0e39f\n0x46,0x55,0x5a,0x5a,0x49,0x4e,\nFUZZIN\nartifact_prefix='./'; Test unit written to ./crash-14b5f09dd74fe15430d803af773ba09a0524670d\nBase64: RlVaWklO\n","shell",[71,349,350,367,371,377,387,395,399,404,419,441,445,451,469,485,490,496,501,507,513,519,546,551,572,581,587,603,612,620,626,639,648,661,670,688,694,700,706,712,718,724,729,750,782,794,818,824,830,858],{"__ignoreMap":69},[100,351,352,355,358,361,364],{"class":102,"line":103},[100,353,354],{"class":110},"docker",[100,356,357],{"class":190}," run",[100,359,360],{"class":167}," -it",[100,362,363],{"class":190}," golang",[100,365,366],{"class":190}," /bin/bash\n",[100,368,369],{"class":102,"line":114},[100,370,118],{"emptyLinePlaceholder":117},[100,372,373],{"class":102,"line":121},[100,374,376],{"class":375},"sAwPA","# Download this example\n",[100,378,379,381,384],{"class":102,"line":152},[100,380,96],{"class":110},[100,382,383],{"class":190}," get",[100,385,386],{"class":190}," gitlab.com/gitlab-org/security-products/demos/coverage-fuzzing/go-fuzzing-example\n",[100,388,389,392],{"class":102,"line":173},[100,390,391],{"class":167},"cd",[100,393,394],{"class":190}," /go/src/gitlab.com/gitlab-org/security-products/demos/coverage-fuzzing/go-fuzzing-example\n",[100,396,397],{"class":102,"line":292},[100,398,118],{"emptyLinePlaceholder":117},[100,400,401],{"class":102,"line":301},[100,402,403],{"class":375},"# download go-fuzz and clang (libfuzzer)\n",[100,405,406,408,410,413,416],{"class":102,"line":307},[100,407,96],{"class":110},[100,409,383],{"class":190},[100,411,412],{"class":167}," -u",[100,414,415],{"class":190}," github.com/dvyukov/go-fuzz/go-fuzz",[100,417,418],{"class":190}," github.com/dvyukov/go-fuzz/go-fuzz-build\n",[100,420,421,424,427,430,432,435,438],{"class":102,"line":313},[100,422,423],{"class":110},"apt",[100,425,426],{"class":190}," update",[100,428,429],{"class":130}," && ",[100,431,423],{"class":110},[100,433,434],{"class":190}," install",[100,436,437],{"class":167}," -y",[100,439,440],{"class":190}," clang\n",[100,442,443],{"class":102,"line":322},[100,444,118],{"emptyLinePlaceholder":117},[100,446,448],{"class":102,"line":447},11,[100,449,450],{"class":375},"# building instrumented version of the code together with libFuzzer integration\n",[100,452,454,457,460,463,466],{"class":102,"line":453},12,[100,455,456],{"class":110},"go-fuzz-build",[100,458,459],{"class":167}," -libfuzzer",[100,461,462],{"class":167}," -o",[100,464,465],{"class":190}," parse-complex.a",[100,467,468],{"class":190}," .\n",[100,470,472,475,478,480,482],{"class":102,"line":471},13,[100,473,474],{"class":110},"clang",[100,476,477],{"class":167}," -fsanitize=fuzzer",[100,479,465],{"class":190},[100,481,462],{"class":167},[100,483,484],{"class":190}," parse-complex\n",[100,486,488],{"class":102,"line":487},14,[100,489,118],{"emptyLinePlaceholder":117},[100,491,493],{"class":102,"line":492},15,[100,494,495],{"class":110},"./parse-complex\n",[100,497,499],{"class":102,"line":498},16,[100,500,118],{"emptyLinePlaceholder":117},[100,502,504],{"class":102,"line":503},17,[100,505,506],{"class":375},"#490479 NEW    ft: 11 corp: 7/37b lim: 477 exec/s: 11962 rss: 25Mb L: 6/6 MS: 1 ChangeByte-\n",[100,508,510],{"class":102,"line":509},18,[100,511,512],{"class":375},"#524288 pulse  ft: 11 corp: 7/37b lim: 509 exec/s: 11915 rss: 25Mb\n",[100,514,516],{"class":102,"line":515},19,[100,517,518],{"class":375},"#1048576        pulse  ft: 11 corp: 7/37b lim: 1030 exec/s: 11915 rss: 25Mb\n",[100,520,522,525,528,531,534,537,540,543],{"class":102,"line":521},20,[100,523,524],{"class":110},"panic:",[100,526,527],{"class":190}," runtime",[100,529,530],{"class":190}," error:",[100,532,533],{"class":190}," index",[100,535,536],{"class":190}," out",[100,538,539],{"class":190}," of",[100,541,542],{"class":190}," range",[100,544,545],{"class":130}," [6] with length 6\n",[100,547,549],{"class":102,"line":548},21,[100,550,118],{"emptyLinePlaceholder":117},[100,552,554,557,560,563,566,569],{"class":102,"line":553},22,[100,555,556],{"class":110},"goroutine",[100,558,559],{"class":167}," 17",[100,561,562],{"class":130}," [running, ",[100,564,565],{"class":190},"locked",[100,567,568],{"class":190}," to",[100,570,571],{"class":190}," thread]:\n",[100,573,575,578],{"class":102,"line":574},23,[100,576,577],{"class":110},"gitlab.com/fuzzing-examples/example-go.ParseComplex.func6(...",[100,579,580],{"class":130},")\n",[100,582,584],{"class":102,"line":583},24,[100,585,586],{"class":110},"        /go/src/gitlab.com/gitlab-org/security-products/demos/coverage-fuzzing/go-fuzzing-example/parse_complex.go:5\n",[100,588,590,593,596,598,601],{"class":102,"line":589},25,[100,591,592],{"class":110},"gitlab.com/fuzzing-examples/example-go.ParseComplex(0x36f1cd0,",[100,594,595],{"class":190}," 0x6,",[100,597,595],{"class":190},[100,599,600],{"class":167}," 0x7ffeaa0d1f80",[100,602,580],{"class":130},[100,604,606,609],{"class":102,"line":605},26,[100,607,608],{"class":110},"        /go/src/gitlab.com/gitlab-org/security-products/demos/coverage-fuzzing/go-fuzzing-example/parse_complex.go:5",[100,610,611],{"class":190}," +0x1b8\n",[100,613,615,618],{"class":102,"line":614},27,[100,616,617],{"class":110},"gitlab.com/fuzzing-examples/example-go.Fuzz(...",[100,619,580],{"class":130},[100,621,623],{"class":102,"line":622},28,[100,624,625],{"class":110},"        /go/src/gitlab.com/gitlab-org/security-products/demos/coverage-fuzzing/go-fuzzing-example/parse_complex_fuzz.go:6\n",[100,627,629,632,634,637],{"class":102,"line":628},29,[100,630,631],{"class":110},"main.LLVMFuzzerTestOneInput(0x36f1cd0,",[100,633,595],{"class":190},[100,635,636],{"class":167}," 0x18",[100,638,580],{"class":130},[100,640,642,645],{"class":102,"line":641},30,[100,643,644],{"class":110},"        gitlab.com/fuzzing-examples/example-go/go.fuzz.main/main.go:35",[100,646,647],{"class":190}," +0x85\n",[100,649,651,654,656,659],{"class":102,"line":650},31,[100,652,653],{"class":110},"main._cgoexpwrap_98ba7f745c88_LLVMFuzzerTestOneInput(0x36f1cd0,",[100,655,595],{"class":190},[100,657,658],{"class":167}," 0x5a4d80",[100,660,580],{"class":130},[100,662,664,667],{"class":102,"line":663},32,[100,665,666],{"class":110},"        _cgo_gotypes.go:64",[100,668,669],{"class":190}," +0x37\n",[100,671,673,676,679,682,685],{"class":102,"line":672},33,[100,674,675],{"class":190},"==1664==",[100,677,678],{"class":190}," ERROR:",[100,680,681],{"class":190}," libFuzzer:",[100,683,684],{"class":190}," deadly",[100,686,687],{"class":190}," signal\n",[100,689,691],{"class":102,"line":690},34,[100,692,693],{"class":375},"    #0 0x450ddf in __sanitizer_print_stack_trace (/go/src/gitlab.com/gitlab-org/security-products/demos/coverage-fuzzing/go-fuzzing-example/parse-complex+0x450ddf)\n",[100,695,697],{"class":102,"line":696},35,[100,698,699],{"class":375},"    #1 0x430f4b in fuzzer::PrintStackTrace() (/go/src/gitlab.com/gitlab-org/security-products/demos/coverage-fuzzing/go-fuzzing-example/parse-complex+0x430f4b)\n",[100,701,703],{"class":102,"line":702},36,[100,704,705],{"class":375},"    #2 0x414b7b in fuzzer::Fuzzer::CrashCallback() (/go/src/gitlab.com/gitlab-org/security-products/demos/coverage-fuzzing/go-fuzzing-example/parse-complex+0x414b7b)\n",[100,707,709],{"class":102,"line":708},37,[100,710,711],{"class":375},"    #3 0x414b3f in fuzzer::Fuzzer::StaticCrashSignalCallback() (/go/src/gitlab.com/gitlab-org/security-products/demos/coverage-fuzzing/go-fuzzing-example/parse-complex+0x414b3f)\n",[100,713,715],{"class":102,"line":714},38,[100,716,717],{"class":375},"    #4 0x7f57c561d72f  (/lib/x86_64-linux-gnu/libpthread.so.0+0x1272f)\n",[100,719,721],{"class":102,"line":720},39,[100,722,723],{"class":375},"    #5 0x4b3a00 in runtime.raise runtime/sys_linux_amd64.s:164\n",[100,725,727],{"class":102,"line":726},40,[100,728,118],{"emptyLinePlaceholder":117},[100,730,732,735,738,741,744,747],{"class":102,"line":731},41,[100,733,734],{"class":110},"NOTE:",[100,736,737],{"class":190}," libFuzzer",[100,739,740],{"class":190}," has",[100,742,743],{"class":190}," rudimentary",[100,745,746],{"class":190}," signal",[100,748,749],{"class":190}," handlers.\n",[100,751,753,756,758,761,764,767,770,773,776,779],{"class":102,"line":752},42,[100,754,755],{"class":110},"      Combine",[100,757,737],{"class":190},[100,759,760],{"class":190}," with",[100,762,763],{"class":190}," AddressSanitizer",[100,765,766],{"class":190}," or",[100,768,769],{"class":190}," similar",[100,771,772],{"class":190}," for",[100,774,775],{"class":190}," better",[100,777,778],{"class":190}," crash",[100,780,781],{"class":190}," reports.\n",[100,783,785,788,790,792],{"class":102,"line":784},43,[100,786,787],{"class":110},"SUMMARY:",[100,789,681],{"class":190},[100,791,684],{"class":190},[100,793,687],{"class":190},[100,795,797,800,803,806,809,812,815],{"class":102,"line":796},44,[100,798,799],{"class":110},"MS:",[100,801,802],{"class":167}," 1",[100,804,805],{"class":190}," ChangeByte-",[100,807,808],{"class":130},"; ",[100,810,811],{"class":110},"base",[100,813,814],{"class":190}," unit:",[100,816,817],{"class":190}," eef4acc7500228bd0f65760be21896f230e0e39f\n",[100,819,821],{"class":102,"line":820},45,[100,822,823],{"class":110},"0x46,0x55,0x5a,0x5a,0x49,0x4e,\n",[100,825,827],{"class":102,"line":826},46,[100,828,829],{"class":110},"FUZZIN\n",[100,831,833,836,839,842,844,847,850,853,855],{"class":102,"line":832},47,[100,834,835],{"class":130},"artifact_prefix",[100,837,838],{"class":106},"=",[100,840,841],{"class":190},"'./'",[100,843,808],{"class":130},[100,845,846],{"class":110},"Test",[100,848,849],{"class":190}," unit",[100,851,852],{"class":190}," written",[100,854,568],{"class":190},[100,856,857],{"class":190}," ./crash-14b5f09dd74fe15430d803af773ba09a0524670d\n",[100,859,861,864],{"class":102,"line":860},48,[100,862,863],{"class":110},"Base64:",[100,865,866],{"class":190}," RlVaWklO\n",[17,868,869],{},"This finds the bug in a few seconds, prints the “FUZZI” string that triggers the vulnerability, and saves the crash to a file.",[12,871,873],{"id":872},"running-go-fuzz-from-gitlab-ci","Running go-fuzz from Gitlab-CI",[17,875,876,877,880,881,886],{},"The best way to integrate go-fuzz fuzzing with Gitlab CI/CD is by adding additional stage & step to your ",[71,878,879],{},".gitlab-ci.yml",".\nIt is straightforward and ",[27,882,885],{"href":883,"rel":884},"https://docs.gitlab.com/user/application_security/coverage_fuzzing/#configuration",[],"fully documented",".",[63,888,891],{"className":889,"code":890,"language":68,"meta":69},[66],"include:\n  - template: Coverage-Fuzzing.gitlab-ci.yml\n\nfuzz_test_parse_complex:\n    extends: .fuzz_base\n    image: golang\n    script:\n        - go get -u github.com/dvyukov/go-fuzz/go-fuzz github.com/dvyukov/go-fuzz/go-fuzz-build\n        - apt update && apt install -y clang\n        - go-fuzz-build -libfuzzer -o parse-complex.a .\n        - clang -fsanitize=fuzzer parse-complex.a -o parse-complex\n        - ./gl-fuzz run --regression=$REGRESSION -- ./parse-complex\n\n",[71,892,890],{"__ignoreMap":69},[17,894,895,896,899],{},"For each fuzz target you will will have to create a step which extends the ",[71,897,898],{},".fuzz_base"," template that runs the following:",[901,902,903,907,910],"ul",{},[904,905,906],"li",{},"Builds the fuzz target.",[904,908,909],{},"Runs the fuzz target via gl-fuzz CLI.",[904,911,912,913,916,917,920],{},"For ",[71,914,915],{},"$CI_DEFAULT_BRANCH"," (can be override by ",[71,918,919],{},"$COV_FUZZING_BRANCH",") will run fully fledged fuzzing sessions.\nFor everything else including MRs will run fuzzing regression with the accumlated corpus and fixed crashes.",[17,922,923,924],{},"This will run your fuzz tests in a blocking manner inside your pipeline. There is also a possability to run longer fuzz sessions asynchronously described in the ",[27,925,928],{"href":926,"rel":927},"https://docs.gitlab.com/user/application_security/coverage_fuzzing/#continuous-fuzzing-long-running-async-fuzzing-jobs",[],"docs",[17,930,931,932,937,938,943],{},"Check out our ",[27,933,936],{"href":934,"rel":935},"https://docs.gitlab.com/user/application_security/coverage_fuzzing/",[],"full documentation"," and the ",[27,939,942],{"href":940,"rel":941},"https://gitlab.com/gitlab-org/security-products/demos/coverage-fuzzing/rust-fuzzing-example",[],"example repo","\nand try adding fuzz testing to your own repos!",[945,946,947],"style",{},"html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}",{"title":69,"searchDepth":114,"depth":114,"links":949},[950,951,952,953,954],{"id":14,"depth":114,"text":15},{"id":22,"depth":114,"text":23},{"id":43,"depth":114,"text":44},{"id":75,"depth":114,"text":76},{"id":872,"depth":114,"text":873},"unfiltered","2020-12-03","Learn how (and why!) to fuzz Go code","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749664102/Blog/Hero%20Images/gitlab-values-cover.png",{},"/en-us/blog/how-to-fuzz-go",{"title":5,"description":957,"ogTitle":5,"ogDescription":957,"noIndex":960,"ogImage":961,"ogUrl":965,"ogSiteName":966,"ogType":967,"canonicalUrls":965},"https://about.gitlab.com/blog/how-to-fuzz-go","https://about.gitlab.com","article","how-to-fuzz-go","en-us/blog/how-to-fuzz-go",[971,972,973],"inside GitLab","security","testing","BlogPost","P-J0uP-NUhCcf2FxvGZDiSWW4h0mdItd99YQAhbAd5w",{"logo":977,"freeTrial":982,"sales":987,"login":992,"items":997,"search":1324,"minimal":1355,"duo":1374,"switchNav":1383,"pricingDeployment":1394},{"config":978},{"href":979,"dataGaName":980,"dataGaLocation":981},"/","gitlab logo","header",{"text":983,"config":984},"Get free trial",{"href":985,"dataGaName":986,"dataGaLocation":981},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":988,"config":989},"Request a demo",{"href":990,"dataGaName":991,"dataGaLocation":981},"/sales/?contact-topic=request-demo","sales",{"text":993,"config":994},"Sign in",{"href":995,"dataGaName":996,"dataGaLocation":981},"https://gitlab.com/users/sign_in/","sign in",[998,1027,1127,1132,1246,1302],{"text":999,"config":1000,"menu":1002},"Platform",{"dataNavLevelOne":1001},"platform",{"type":1003,"columns":1004},"cards",[1005,1011,1019],{"title":999,"description":1006,"link":1007},"The intelligent orchestration platform for DevSecOps",{"text":1008,"config":1009},"Explore our Platform",{"href":1010,"dataGaName":1001,"dataGaLocation":981},"/platform/",{"title":1012,"description":1013,"link":1014},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":1015,"config":1016},"Meet GitLab Duo",{"href":1017,"dataGaName":1018,"dataGaLocation":981},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":1020,"description":1021,"link":1022},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":1023,"config":1024},"Learn more",{"href":1025,"dataGaName":1026,"dataGaLocation":981},"/why-gitlab/","why gitlab",{"text":1028,"left":117,"config":1029,"menu":1031},"Product",{"dataNavLevelOne":1030},"solutions",{"type":1032,"link":1033,"columns":1037,"feature":1106},"lists",{"text":1034,"config":1035},"View all Solutions",{"href":1036,"dataGaName":1030,"dataGaLocation":981},"/solutions/",[1038,1062,1085],{"title":1039,"description":1040,"link":1041,"items":1046},"Automation","CI/CD and automation to accelerate deployment",{"config":1042},{"icon":1043,"href":1044,"dataGaName":1045,"dataGaLocation":981},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[1047,1051,1054,1058],{"text":1048,"config":1049},"CI/CD",{"href":1050,"dataGaLocation":981,"dataGaName":1048},"/solutions/continuous-integration/",{"text":1012,"config":1052},{"href":1017,"dataGaLocation":981,"dataGaName":1053},"gitlab duo agent platform - product menu",{"text":1055,"config":1056},"Source Code Management",{"href":1057,"dataGaLocation":981,"dataGaName":1055},"/solutions/source-code-management/",{"text":1059,"config":1060},"Automated Software Delivery",{"href":1044,"dataGaLocation":981,"dataGaName":1061},"Automated software delivery",{"title":1063,"description":1064,"link":1065,"items":1070},"Security","Deliver code faster without compromising security",{"config":1066},{"href":1067,"dataGaName":1068,"dataGaLocation":981,"icon":1069},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[1071,1075,1080],{"text":1072,"config":1073},"Application Security Testing",{"href":1067,"dataGaName":1074,"dataGaLocation":981},"Application security testing",{"text":1076,"config":1077},"Software Supply Chain Security",{"href":1078,"dataGaLocation":981,"dataGaName":1079},"/solutions/supply-chain/","Software supply chain security",{"text":1081,"config":1082},"Software Compliance",{"href":1083,"dataGaName":1084,"dataGaLocation":981},"/solutions/software-compliance/","software compliance",{"title":1086,"link":1087,"items":1092},"Measurement",{"config":1088},{"icon":1089,"href":1090,"dataGaName":1091,"dataGaLocation":981},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[1093,1097,1101],{"text":1094,"config":1095},"Visibility & Measurement",{"href":1090,"dataGaLocation":981,"dataGaName":1096},"Visibility and Measurement",{"text":1098,"config":1099},"Value Stream Management",{"href":1100,"dataGaLocation":981,"dataGaName":1098},"/solutions/value-stream-management/",{"text":1102,"config":1103},"Analytics & Insights",{"href":1104,"dataGaLocation":981,"dataGaName":1105},"/solutions/analytics-and-insights/","Analytics and insights",{"title":1107,"type":1032,"items":1108},"GitLab for",[1109,1115,1121],{"text":1110,"config":1111},"Enterprise",{"icon":1112,"href":1113,"dataGaLocation":981,"dataGaName":1114},"Building","/enterprise/","enterprise",{"text":1116,"config":1117},"Small Business",{"icon":1118,"href":1119,"dataGaLocation":981,"dataGaName":1120},"Work","/small-business/","small business",{"text":1122,"config":1123},"Public Sector",{"icon":1124,"href":1125,"dataGaLocation":981,"dataGaName":1126},"Organization","/solutions/public-sector/","public sector",{"text":1128,"config":1129},"Pricing",{"href":1130,"dataGaName":1131,"dataGaLocation":981,"dataNavLevelOne":1131},"/pricing/","pricing",{"text":1133,"config":1134,"menu":1136},"Resources",{"dataNavLevelOne":1135},"resources",{"type":1032,"link":1137,"columns":1141,"feature":1235},{"text":1138,"config":1139},"View all resources",{"href":1140,"dataGaName":1135,"dataGaLocation":981},"/resources/",[1142,1175,1202],{"title":1143,"items":1144},"Getting started",[1145,1150,1155,1160,1165,1170],{"text":1146,"config":1147},"Install",{"href":1148,"dataGaName":1149,"dataGaLocation":981},"/install/","install",{"text":1151,"config":1152},"Quick start guides",{"href":1153,"dataGaName":1154,"dataGaLocation":981},"/get-started/","quick setup checklists",{"text":1156,"config":1157},"Learn",{"href":1158,"dataGaLocation":981,"dataGaName":1159},"https://university.gitlab.com/","learn",{"text":1161,"config":1162},"Product documentation",{"href":1163,"dataGaName":1164,"dataGaLocation":981},"https://docs.gitlab.com/","product documentation",{"text":1166,"config":1167},"Best practice videos",{"href":1168,"dataGaName":1169,"dataGaLocation":981},"/getting-started-videos/","best practice videos",{"text":1171,"config":1172},"Integrations",{"href":1173,"dataGaName":1174,"dataGaLocation":981},"/integrations/","integrations",{"title":1176,"items":1177},"Discover",[1178,1183,1188,1193,1197],{"text":1179,"config":1180},"Customer success stories",{"href":1181,"dataGaName":1182,"dataGaLocation":981},"/customers/","customer success stories",{"text":1184,"config":1185},"Blog",{"href":1186,"dataGaName":1187,"dataGaLocation":981},"/blog/","blog",{"text":1189,"config":1190},"Demo Hub",{"href":1191,"dataGaName":1192,"dataGaLocation":981},"/demo-hub/","demo hub",{"text":1194,"config":1195},"The Source",{"href":1196,"dataGaName":1187,"dataGaLocation":981},"/the-source/",{"text":1198,"config":1199},"Remote",{"href":1200,"dataGaName":1201,"dataGaLocation":981},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":1203,"items":1204},"Connect",[1205,1210,1215,1220,1225,1230],{"text":1206,"config":1207},"GitLab Services",{"href":1208,"dataGaName":1209,"dataGaLocation":981},"/services/","services",{"text":1211,"config":1212},"Contribute",{"href":1213,"dataGaName":1214,"dataGaLocation":981},"https://contributors.gitlab.com","contribute",{"text":1216,"config":1217},"Community",{"href":1218,"dataGaName":1219,"dataGaLocation":981},"/community/","community",{"text":1221,"config":1222},"Forum",{"href":1223,"dataGaName":1224,"dataGaLocation":981},"https://forum.gitlab.com/","forum",{"text":1226,"config":1227},"Events",{"href":1228,"dataGaName":1229,"dataGaLocation":981},"/events/","events",{"text":1231,"config":1232},"Partners",{"href":1233,"dataGaName":1234,"dataGaLocation":981},"/partners/","partners",{"config":1236,"title":1239,"text":1240,"link":1241},{"background":1237,"textColor":1238},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","What’s new in GitLab","Stay updated with our latest features and improvements.",{"text":1242,"config":1243},"Read the latest",{"href":1244,"dataGaName":1245,"dataGaLocation":981},"/whats-new/","whats new",{"text":1247,"config":1248,"menu":1250},"Company",{"dataNavLevelOne":1249},"company",{"type":1032,"columns":1251},[1252],{"items":1253},[1254,1259,1265,1267,1272,1277,1282,1287,1292,1297],{"text":1255,"config":1256},"About",{"href":1257,"dataGaName":1258,"dataGaLocation":981},"/company/","about",{"text":1260,"config":1261,"footerGa":1264},"Jobs",{"href":1262,"dataGaName":1263,"dataGaLocation":981},"/jobs/","jobs",{"dataGaName":1263},{"text":1226,"config":1266},{"href":1228,"dataGaName":1229,"dataGaLocation":981},{"text":1268,"config":1269},"Leadership",{"href":1270,"dataGaName":1271,"dataGaLocation":981},"/company/team/e-group/","leadership",{"text":1273,"config":1274},"Handbook",{"href":1275,"dataGaName":1276,"dataGaLocation":981},"https://handbook.gitlab.com/","handbook",{"text":1278,"config":1279},"Investor relations",{"href":1280,"dataGaName":1281,"dataGaLocation":981},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1283,"config":1284},"Trust Center",{"href":1285,"dataGaName":1286,"dataGaLocation":981},"/security/","trust center",{"text":1288,"config":1289},"AI Transparency Center",{"href":1290,"dataGaName":1291,"dataGaLocation":981},"/ai-transparency-center/","ai transparency center",{"text":1293,"config":1294},"Newsletter",{"href":1295,"dataGaName":1296,"dataGaLocation":981},"/company/contact/#contact-forms","newsletter",{"text":1298,"config":1299},"Press",{"href":1300,"dataGaName":1301,"dataGaLocation":981},"/press/","press",{"text":1303,"config":1304,"menu":1305},"Contact us",{"dataNavLevelOne":1249},{"type":1032,"columns":1306},[1307],{"items":1308},[1309,1314,1319],{"text":1310,"config":1311},"Talk to sales",{"href":1312,"dataGaName":1313,"dataGaLocation":981},"/sales/","talk to sales",{"text":1315,"config":1316},"Support portal",{"href":1317,"dataGaName":1318,"dataGaLocation":981},"https://support.gitlab.com/hc/en-us","support portal",{"text":1320,"config":1321},"Customer portal",{"href":1322,"dataGaName":1323,"dataGaLocation":981},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1325,"login":1326,"suggestions":1333},"Close",{"text":1327,"link":1328},"To search repositories and projects, login to",{"text":1329,"config":1330},"gitlab.com",{"href":995,"dataGaName":1331,"dataGaLocation":1332},"search login","search",{"text":1334,"default":1335},"Suggestions",[1336,1338,1342,1344,1348,1352],{"text":1012,"config":1337},{"href":1017,"dataGaName":1012,"dataGaLocation":1332},{"text":1339,"config":1340},"Code Suggestions (AI)",{"href":1341,"dataGaName":1339,"dataGaLocation":1332},"/solutions/code-suggestions/",{"text":1048,"config":1343},{"href":1050,"dataGaName":1048,"dataGaLocation":1332},{"text":1345,"config":1346},"GitLab on AWS",{"href":1347,"dataGaName":1345,"dataGaLocation":1332},"/partners/technology-partners/aws/",{"text":1349,"config":1350},"GitLab on Google Cloud",{"href":1351,"dataGaName":1349,"dataGaLocation":1332},"/partners/technology-partners/google-cloud-platform/",{"text":1353,"config":1354},"Why GitLab?",{"href":1025,"dataGaName":1353,"dataGaLocation":1332},{"freeTrial":1356,"mobileIcon":1361,"desktopIcon":1366,"secondaryButton":1369},{"text":1357,"config":1358},"Start free trial",{"href":1359,"dataGaName":986,"dataGaLocation":1360},"https://gitlab.com/-/trials/new/","nav",{"altText":1362,"config":1363},"Gitlab Icon",{"src":1364,"dataGaName":1365,"dataGaLocation":1360},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1362,"config":1367},{"src":1368,"dataGaName":1365,"dataGaLocation":1360},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1370,"config":1371},"Get Started",{"href":1372,"dataGaName":1373,"dataGaLocation":1360},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":1375,"mobileIcon":1379,"desktopIcon":1381},{"text":1376,"config":1377},"Learn more about GitLab Duo",{"href":1017,"dataGaName":1378,"dataGaLocation":1360},"gitlab duo",{"altText":1362,"config":1380},{"src":1364,"dataGaName":1365,"dataGaLocation":1360},{"altText":1362,"config":1382},{"src":1368,"dataGaName":1365,"dataGaLocation":1360},{"button":1384,"mobileIcon":1389,"desktopIcon":1391},{"text":1385,"config":1386},"/switch",{"href":1387,"dataGaName":1388,"dataGaLocation":1360},"#contact","switch",{"altText":1362,"config":1390},{"src":1364,"dataGaName":1365,"dataGaLocation":1360},{"altText":1362,"config":1392},{"src":1393,"dataGaName":1365,"dataGaLocation":1360},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1395,"mobileIcon":1400,"desktopIcon":1402},{"text":1396,"config":1397},"Back to pricing",{"href":1130,"dataGaName":1398,"dataGaLocation":1360,"icon":1399},"back to pricing","GoBack",{"altText":1362,"config":1401},{"src":1364,"dataGaName":1365,"dataGaLocation":1360},{"altText":1362,"config":1403},{"src":1368,"dataGaName":1365,"dataGaLocation":1360},{"title":1405,"titleMobile":1406,"button":1407,"config":1412},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":1023,"config":1408},{"href":1409,"dataGaName":1410,"dataGaLocation":1411},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":1413,"disabled":960},"release",{"data":1415},{"text":1416,"source":1417,"edit":1423,"contribute":1428,"config":1433,"items":1438,"minimal":1647},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":1418,"config":1419},"View page source",{"href":1420,"dataGaName":1421,"dataGaLocation":1422},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1424,"config":1425},"Edit this page",{"href":1426,"dataGaName":1427,"dataGaLocation":1422},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1429,"config":1430},"Please contribute",{"href":1431,"dataGaName":1432,"dataGaLocation":1422},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1434,"facebook":1435,"youtube":1436,"linkedin":1437},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1439,1486,1540,1584,1615],{"title":1128,"links":1440,"subMenu":1455},[1441,1445,1450],{"text":1442,"config":1443},"View plans",{"href":1130,"dataGaName":1444,"dataGaLocation":1422},"view plans",{"text":1446,"config":1447},"Why Premium?",{"href":1448,"dataGaName":1449,"dataGaLocation":1422},"/pricing/premium/","why premium",{"text":1451,"config":1452},"Why Ultimate?",{"href":1453,"dataGaName":1454,"dataGaLocation":1422},"/pricing/ultimate/","why ultimate",[1456],{"title":1457,"links":1458},"Contact Us",[1459,1462,1464,1466,1471,1476,1481],{"text":1460,"config":1461},"Contact sales",{"href":1312,"dataGaName":991,"dataGaLocation":1422},{"text":1315,"config":1463},{"href":1317,"dataGaName":1318,"dataGaLocation":1422},{"text":1320,"config":1465},{"href":1322,"dataGaName":1323,"dataGaLocation":1422},{"text":1467,"config":1468},"Status",{"href":1469,"dataGaName":1470,"dataGaLocation":1422},"https://status.gitlab.com/","status",{"text":1472,"config":1473},"Terms of use",{"href":1474,"dataGaName":1475,"dataGaLocation":1422},"/terms/","terms of use",{"text":1477,"config":1478},"Privacy statement",{"href":1479,"dataGaName":1480,"dataGaLocation":1422},"/privacy/","privacy statement",{"text":1482,"config":1483},"Cookie preferences",{"dataGaName":1484,"dataGaLocation":1422,"id":1485,"isOneTrustButton":117},"cookie preferences","ot-sdk-btn",{"title":1028,"links":1487,"subMenu":1496},[1488,1492],{"text":1489,"config":1490},"DevSecOps platform",{"href":1010,"dataGaName":1491,"dataGaLocation":1422},"devsecops platform",{"text":1493,"config":1494},"AI-Assisted Development",{"href":1017,"dataGaName":1495,"dataGaLocation":1422},"ai-assisted development",[1497],{"title":1498,"links":1499},"Topics",[1500,1505,1510,1515,1520,1525,1530,1535],{"text":1501,"config":1502},"CICD",{"href":1503,"dataGaName":1504,"dataGaLocation":1422},"/topics/ci-cd/","cicd",{"text":1506,"config":1507},"GitOps",{"href":1508,"dataGaName":1509,"dataGaLocation":1422},"/topics/gitops/","gitops",{"text":1511,"config":1512},"DevOps",{"href":1513,"dataGaName":1514,"dataGaLocation":1422},"/topics/devops/","devops",{"text":1516,"config":1517},"Version Control",{"href":1518,"dataGaName":1519,"dataGaLocation":1422},"/topics/version-control/","version control",{"text":1521,"config":1522},"DevSecOps",{"href":1523,"dataGaName":1524,"dataGaLocation":1422},"/topics/devsecops/","devsecops",{"text":1526,"config":1527},"Cloud Native",{"href":1528,"dataGaName":1529,"dataGaLocation":1422},"/topics/cloud-native/","cloud native",{"text":1531,"config":1532},"AI for Coding",{"href":1533,"dataGaName":1534,"dataGaLocation":1422},"/topics/devops/ai-for-coding/","ai for coding",{"text":1536,"config":1537},"Agentic AI",{"href":1538,"dataGaName":1539,"dataGaLocation":1422},"/topics/agentic-ai/","agentic ai",{"title":1541,"links":1542},"Solutions",[1543,1545,1547,1552,1556,1559,1563,1566,1568,1571,1574,1579],{"text":1072,"config":1544},{"href":1067,"dataGaName":1072,"dataGaLocation":1422},{"text":1061,"config":1546},{"href":1044,"dataGaName":1045,"dataGaLocation":1422},{"text":1548,"config":1549},"Agile development",{"href":1550,"dataGaName":1551,"dataGaLocation":1422},"/solutions/agile-delivery/","agile delivery",{"text":1553,"config":1554},"SCM",{"href":1057,"dataGaName":1555,"dataGaLocation":1422},"source code management",{"text":1501,"config":1557},{"href":1050,"dataGaName":1558,"dataGaLocation":1422},"continuous integration & delivery",{"text":1560,"config":1561},"Value stream management",{"href":1100,"dataGaName":1562,"dataGaLocation":1422},"value stream management",{"text":1506,"config":1564},{"href":1565,"dataGaName":1509,"dataGaLocation":1422},"/solutions/gitops/",{"text":1110,"config":1567},{"href":1113,"dataGaName":1114,"dataGaLocation":1422},{"text":1569,"config":1570},"Small business",{"href":1119,"dataGaName":1120,"dataGaLocation":1422},{"text":1572,"config":1573},"Public sector",{"href":1125,"dataGaName":1126,"dataGaLocation":1422},{"text":1575,"config":1576},"Education",{"href":1577,"dataGaName":1578,"dataGaLocation":1422},"/solutions/education/","education",{"text":1580,"config":1581},"Financial services",{"href":1582,"dataGaName":1583,"dataGaLocation":1422},"/solutions/finance/","financial services",{"title":1133,"links":1585},[1586,1588,1590,1592,1594,1596,1599,1601,1603,1605,1607,1609,1611,1613],{"text":1146,"config":1587},{"href":1148,"dataGaName":1149,"dataGaLocation":1422},{"text":1151,"config":1589},{"href":1153,"dataGaName":1154,"dataGaLocation":1422},{"text":1156,"config":1591},{"href":1158,"dataGaName":1159,"dataGaLocation":1422},{"text":1161,"config":1593},{"href":1163,"dataGaName":928,"dataGaLocation":1422},{"text":1184,"config":1595},{"href":1186,"dataGaName":1187,"dataGaLocation":1422},{"text":1597,"config":1598},"What's new",{"href":1244,"dataGaName":1245,"dataGaLocation":1422},{"text":1179,"config":1600},{"href":1181,"dataGaName":1182,"dataGaLocation":1422},{"text":1198,"config":1602},{"href":1200,"dataGaName":1201,"dataGaLocation":1422},{"text":1206,"config":1604},{"href":1208,"dataGaName":1209,"dataGaLocation":1422},{"text":1211,"config":1606},{"href":1213,"dataGaName":1214,"dataGaLocation":1422},{"text":1216,"config":1608},{"href":1218,"dataGaName":1219,"dataGaLocation":1422},{"text":1221,"config":1610},{"href":1223,"dataGaName":1224,"dataGaLocation":1422},{"text":1226,"config":1612},{"href":1228,"dataGaName":1229,"dataGaLocation":1422},{"text":1231,"config":1614},{"href":1233,"dataGaName":1234,"dataGaLocation":1422},{"title":1247,"links":1616},[1617,1619,1621,1623,1625,1627,1631,1636,1638,1640,1642],{"text":1255,"config":1618},{"href":1257,"dataGaName":1249,"dataGaLocation":1422},{"text":1260,"config":1620},{"href":1262,"dataGaName":1263,"dataGaLocation":1422},{"text":1268,"config":1622},{"href":1270,"dataGaName":1271,"dataGaLocation":1422},{"text":1273,"config":1624},{"href":1275,"dataGaName":1276,"dataGaLocation":1422},{"text":1278,"config":1626},{"href":1280,"dataGaName":1281,"dataGaLocation":1422},{"text":1628,"config":1629},"Sustainability",{"href":1630,"dataGaName":1628,"dataGaLocation":1422},"/sustainability/",{"text":1632,"config":1633},"Diversity, inclusion and belonging (DIB)",{"href":1634,"dataGaName":1635,"dataGaLocation":1422},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1283,"config":1637},{"href":1285,"dataGaName":1286,"dataGaLocation":1422},{"text":1293,"config":1639},{"href":1295,"dataGaName":1296,"dataGaLocation":1422},{"text":1298,"config":1641},{"href":1300,"dataGaName":1301,"dataGaLocation":1422},{"text":1643,"config":1644},"Modern Slavery Transparency Statement",{"href":1645,"dataGaName":1646,"dataGaLocation":1422},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1648},[1649,1652,1655],{"text":1650,"config":1651},"Terms",{"href":1474,"dataGaName":1475,"dataGaLocation":1422},{"text":1653,"config":1654},"Cookies",{"dataGaName":1484,"dataGaLocation":1422,"id":1485,"isOneTrustButton":117},{"text":1656,"config":1657},"Privacy",{"href":1479,"dataGaName":1480,"dataGaLocation":1422},[1659],{"id":1660,"title":7,"body":959,"config":1661,"content":1663,"description":959,"extension":1666,"meta":1667,"navigation":117,"path":1668,"seo":1669,"stem":1670,"__hash__":1671},"blogAuthors/en-us/blog/authors/yevgeny-pats.yml",{"template":1662},"BlogAuthor",{"name":7,"config":1664},{"headshot":69,"ctfId":1665},"ypats","yml",{},"/en-us/blog/authors/yevgeny-pats",{},"en-us/blog/authors/yevgeny-pats","Eyf0FMujgvuiOm0zj0NDJAlOukR9i1LRkM8OsWsmc6M",[1673,1680,1688],{"title":1674,"description":1675,"heroImage":961,"category":955,"date":1676,"authors":1677,"slug":1679,"externalUrl":959},"CEO Shadow Takeaways from Jacie","Recap of my experience in the CEO Shadow Program.","2021-05-18",[1678],"Jacie Bandur","ceo-shadow-recap",{"title":1681,"description":1682,"heroImage":1683,"category":955,"date":1684,"authors":1685,"slug":1687,"externalUrl":959},"Why I love contributing to GitLab","Making small meaningful changes is what it's all about.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749679501/Blog/Hero%20Images/new-feature.png","2021-05-11",[1686],"Austin Regnery","why-i-love-contributing-to-gitlab",{"title":1689,"description":1690,"heroImage":1691,"category":955,"date":1684,"authors":1692,"slug":1694,"externalUrl":959},"Placebo Lines on the Pipeline Graph","Have you noticed the connecting lines missing on your pipelines lately? Here's why","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749679507/Blog/Hero%20Images/ci-cd.png",[1693],"Sam Beckham","placebo-lines-on-the-pipeline-graph",{"promotions":1696},[1697,1711,1723,1734],{"id":1698,"categories":1699,"header":1701,"text":1702,"button":1703,"image":1708},"ai-modernization",[1700],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1704,"config":1705},"Get your AI maturity score",{"href":1706,"dataGaName":1707,"dataGaLocation":1187},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1709},{"src":1710},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1712,"categories":1713,"header":1715,"text":1702,"button":1716,"image":1720},"devops-modernization",[1714,1524],"product","Are you just managing tools or shipping innovation?",{"text":1717,"config":1718},"Get your DevOps maturity score",{"href":1719,"dataGaName":1707,"dataGaLocation":1187},"/assessments/devops-modernization-assessment/",{"config":1721},{"src":1722},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1724,"categories":1725,"header":1726,"text":1702,"button":1727,"image":1731},"security-modernization",[972],"Are you trading speed for security?",{"text":1728,"config":1729},"Get your security maturity score",{"href":1730,"dataGaName":1707,"dataGaLocation":1187},"/assessments/security-modernization-assessment/",{"config":1732},{"src":1733},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1735,"paths":1736,"header":1739,"text":1740,"button":1741,"image":1746},"github-azure-migration",[1737,1738],"migration-from-azure-devops-to-gitlab","integrating-azure-devops-scm-and-gitlab","Is your team ready for GitHub's Azure move?","GitHub is already rebuilding around Azure. Find out what it means for you.",{"text":1742,"config":1743},"See how GitLab compares to GitHub",{"href":1744,"dataGaName":1745,"dataGaLocation":1187},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1747},{"src":1722},{"header":1749,"blurb":1750,"button":1751,"secondaryButton":1756},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1752,"config":1753},"Get your free trial",{"href":1754,"dataGaName":986,"dataGaLocation":1755},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":1460,"config":1757},{"href":1312,"dataGaName":991,"dataGaLocation":1755},1786803771524]