The trade is riskless in principle: buy the asset today at the spot price, borrow to pay for it, pay storage and insurance, and simultaneously sell a futures contract that obliges you to deliver at a known price. If the futures price exceeds spot plus all carrying costs, the difference is locked in.
This is the arbitrage that enforces cost-of-carry and caps contango at full-carry. When futures rise above that ceiling, arbitrageurs sell them and buy physical until the gap closes. The reverse trade is harder because you cannot always borrow a physical commodity, which is why backwardation can persist.
Capacity limits matter. If storage is full, the arbitrage cannot be done at any price, and the curve can go into super-contango as it did in oil in 2020.
Example: gold spot $2,400, one-year financing 5%, storage and insurance 0.3%. Full carry is 2,400 x 1.053 = $2,527. If the twelve-month future trades at $2,560, selling it against bought bullion locks in $33 an ounce, or $3,300 on a 100-ounce contract.
Related: cost-of-carry, full-carry, contango, convergence, storage-cost